【发布时间】:2017-09-13 06:51:24
【问题描述】:
我正在使用 awk 来合并多个 (>3) 文件,并且我想保留标题。我发现以前的帖子完全符合我的需要,但我不太明白发生了什么。我希望有人可以指导我完成它,以便我可以从中学习! (我尝试评论原帖但没有足够的声誉)
这段代码
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
想要的输出
合并.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,它根据行的顺序而不是每行第一个字段的值来执行所有操作。如果您需要检查ids,因为它们可能因文件而异,那么您需要不同的解决方案。 -
啊。很高兴知道。我确实希望程序检查 ID。事实证明,对于我正在使用的当前文件,id 是相同的,但在未来,情况并非总是如此。如果我想合并引用 id,最好的解决方案是什么?将
a[FNR])?a[FNR]FS$2:$0)中的FNR替换为$1? -- NVM 在下面看到了您的代码。谢谢!