2016-09-05 32 views
1

我有一種情況,我想用另一個文件中的相應行替換大文件的第4行,從第1行開始(所以行1 ,5,9等)。用另一個文件中的相應行替換文件的每一行第4行

我試過使用sed,但無法弄清楚如何使用第二個文件的每個第四行作爲替換的輸入。

到目前爲止,我有: 「?」

sed '1~4 s/.*/?/' original-file.txt > output-file.txt 

我可以使用,而不是什麼正確替換線條?

任何幫助,非常感謝!

回答

3

每當我看到的東西不僅僅是一個簡單的思考,我從我的大腦中刪除sed,並試着用awk來做。可能我也是awk-有偏見,但我確實認爲它存儲數據和訪問行號的方式更好,更容易理解sed

所以,讓我們使用the FNR==NR trick檢查一個文件,然後其他:

awk 'FNR==NR {data[FNR]=$0; next} # store data from file 1 
    (FNR%4==1){     # in file 2, if line number is (4k + 1) 
     $0=data[FNR]    # replace with the same line from the 1st file 
    }1' file1 file2    # print the line 

這裏的關鍵是把所有的數據從文件1存儲陣列data[]中,每行作爲指數其行號。

然後,讀取文件2時,線被替換爲文件1的相應行,如果它的數量是4的

多見,用從100到110,其具有數從1的序列的示例10交錯:

$ awk 'FNR==NR {data[FNR]=$0; next} (FNR%4==1){$0=data[FNR]}1' <(seq 10) <(seq 100 110) 
1 
101 
102 
103 
5 
105 
106 
107 
9 
109 
110 
+0

fyi:OP的措辭並不反映'sed'命令,雖然它適用於行1,5,9,13等。 – Sundeep

+1

啊是的,我會將其編輯到我的問題中。感謝您的幫助! – PokeUse

+1

@感謝您的觀察。 'FNR%4 == 1'應該。讓我們來看看OP更新的內容。 – fedorqui

0

如果你不介意用perl,這裏有一個小腳本

#!/usr/bin/perl 

open my $fh1,'<','original-file.txt' or die; 
open my $fh2,'<','other-file.txt' or die; 
open my $out,'>','output-file.txt' or die; 
my $n=0; 
while (<$fh1>) { 
    my $s=<$fh2>; 
    print $out ($n++ % 4 == 0 ? $s : $_); 
} 

這將避免加載在內存中的數據,因此在操作利弊完全記憶。

0

這可能爲你工作(GNU SED):

sed '1~4!d' file2 | sed $'1~4{R/dev/stdin\n;d}' file1 > outFile 

它使用使用文件名/dev/stdin第一到第二的SED和管道結果2所調用。同時使用歧義$'...'將換行符插入到第二個調用中。

相關問題