我正在使用awk合并多个(> 3)文件,并且我想保留标题。我发现以前的帖子完全符合我的需求,但我不太明白发生了什么。我希望有人能够通过它,让我可以从中学习! (我想评论对原来的职位,但没有足够的声誉)有人可以通过这个awk代码合并多个文件吗?
此代码
awk '{a[FNR]=((a[FNR])?a[FNR]FS$2:$0)}END{for(i=1;i<=FNR;i++) print a[i]}' f*
根据需要将输入文件。请参阅下面的示例表。
输入文件:
FILE1.TXT:
id value1
a 10
b 30
c 50
FILE2.TXT:
id value2
a 90
b 30
c 20
file3.txt:
id value3
a 0
b 1
c 25
期望的输出
merge.txt:
id value1 value2 value3
a 10 90 0
b 30 30 1
c 50 20 25
同样,这里的代码
awk '{a[FNR]=((a[FNR])?a[FNR]FS$2:$0)}END{for(i=1;i<=FNR;i++) print a[i]}' f* > merge.txt
我无法理解代码{a[FNR]=((a[FNR])?a[FNR]FS$2:$0)}
的第一部分,但了解的第二部分循环码。
我认为在代码的第一部分,一个数组正在建立。代码运行并检查第一列id
上的匹配记录,如果匹配,则附加第二列($2
)value
并打印整个记录($0
)。
但是...我不明白开始语法。什么时候确定第一列id
在所有三个文件中都是相同的,并且只添加第二列?
该代码不使用或引用'id',它根据行的顺序执行所有操作,而不是每行的第一个字段的值。如果你需要检查'id's,因为它们可以跨文件变化,那么你需要一个不同的解决方案。 –
啊。很高兴知道。我确实希望程序检查ID。事实证明,对于当前使用ID的文件是一样的,但将来并不总是如此。如果我想引用id,那么最好的解决方案是什么?用'$ 1'替换'FNR'中的'FNR')?[FNR] FS $ 2:$ 0)'? - NVM在下面看到您的代码。谢谢! – moxed