如何用另一个文本文件的行列表替换文本文件的每个第二行。
示例:
cat filea.txt
我爱粉红色
我爱蓝色
我爱狗
我爱 MOMO
cat bileb.txt
我讨厌黄色
我讨厌白色
我讨厌老鼠
我讨厌猪
现在我需要输出
I love Pink
我讨厌黄色
我爱狗
我讨厌老鼠
textbile b 应该替换文本 filea 的每个第二行而不附加它。我们如何使用 sed 或 awk 中的 -i 来实现这一点。
我尝试使用 paste 命令来做到这一点,它不会替换它附加。
答案1
使用 GNU sed,您可以使用以下R
命令:
R filename Append a line read from filename. Each invocation of the command reads a line from the file. This is a GNU extension.
所以
$ sed 'R fileb.txt' filea.txt
I love Pink
I hate yello
I love Blue
I hate white
I love Dogs
I hate rats
I love MOMO
I hate pigs
结合d
删除原行:
$ sed -e '2~2{R fileb.txt' -e 'd;}' filea.txt
I love Pink
I hate yello
I love Dogs
I hate white
如果要将 filea.txt 的每隔一行替换为 fileb.txt 的每隔一行,那么:
$ sed '2~2d' fileb.txt | sed -e '2~2{R /dev/stdin' -e 'd;}' filea.txt
I love Pink
I hate yello
I love Dogs
I hate rats
或者,使用paste
将文件的行并排连接起来,然后通过管道将sed
奇数行的默认制表符分隔符更改为换行符:
$ paste filea.txt fileb.txt | sed -n '1~2s/\t/\n/p'
I love Pink
I hate yello
I love Dogs
I hate rats
显然,如果原始 filea.txt 可能包含制表符,则此方法不起作用。
由于您也标记了您的问题awk
,因此您也可以考虑类似
awk '{getline x < "fileb.txt"} NR%2 {print; print x}' filea.txt