我有一種情況,我想用另一個文件中的相應行替換大文件的第4行,從第1行開始(所以行1 ,5,9等)。用另一個文件中的相應行替換文件的每一行第4行
我試過使用sed,但無法弄清楚如何使用第二個文件的每個第四行作爲替換的輸入。
到目前爲止,我有: 「?」
sed '1~4 s/.*/?/' original-file.txt > output-file.txt
我可以使用,而不是什麼正確替換線條?
任何幫助,非常感謝!
我有一種情況,我想用另一個文件中的相應行替換大文件的第4行,從第1行開始(所以行1 ,5,9等)。用另一個文件中的相應行替換文件的每一行第4行
我試過使用sed,但無法弄清楚如何使用第二個文件的每個第四行作爲替換的輸入。
到目前爲止,我有: 「?」
sed '1~4 s/.*/?/' original-file.txt > output-file.txt
我可以使用,而不是什麼正確替換線條?
任何幫助,非常感謝!
每當我看到的東西不僅僅是一個簡單的思考,我從我的大腦中刪除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
如果你不介意用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 : $_);
}
這將避免加載在內存中的數據,因此在操作利弊完全記憶。
這可能爲你工作(GNU SED):
sed '1~4!d' file2 | sed $'1~4{R/dev/stdin\n;d}' file1 > outFile
它使用使用文件名/dev/stdin
第一到第二的SED和管道結果2所調用。同時使用歧義$'...'
將換行符插入到第二個調用中。
fyi:OP的措辭並不反映'sed'命令,雖然它適用於行1,5,9,13等。 – Sundeep
啊是的,我會將其編輯到我的問題中。感謝您的幫助! – PokeUse
@感謝您的觀察。 'FNR%4 == 1'應該。讓我們來看看OP更新的內容。 – fedorqui