我有一种情况,我想用另一个文件中的相应行替换大文件的第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