使用awk或sed按行号合并两个文件

时间:2015-10-13 13:40:52

标签: bash awk sed

我有两个文件,比如FileA和FileB。 FileA有n行,FileB有5n行。我想将这两个文件合并到一个新文件FileC中,以便FileB中的每一行都被FileA中的一行替换。

实施例

FileA: 0 \ n,1 \ n

FILEB: A \ n B \ n C \ n D \ n E \ n F \ n G \ n H \ n I \ n J \ n

FileC: 0 \ n B \ n C \ n D \ n E \ n 1 \ n G \ n H \ n I \ n J \ n

(\ n是换行符)

我知道如何使用shell中的循环来做到这一点,但我希望学习一种更简洁的方法来使用awk或sed。我找到了许多使用awk处理两个文件的解决方案,但它们主要基于字段比较而不是行号。如果这个问题重复,我很抱歉,如果有的话,请指出一个类似的问题和答案。

2 个答案:

答案 0 :(得分:2)

awk '{if(NR%5==1) { getline line < "FILEA"; print line; } else { print $0; }}' FILEB

如果您想使用文件名作为参数,您也可以尝试:

awk 'NR!=FNR{exit} {if(NR%5==1) { getline line < ARGV[2]; print line; } else { print $0; }}' FILEB FILEA

答案 1 :(得分:1)

awk 'NR!=FNR{exit}NR%5==1{getline <ARGV[2]}{print}' FileB FileA

请注意,文件名的输入顺序相反:largefile smallfile。

这也优雅地处理了FileA短于1/5 FileB的情况。