很多人非常有帮助张贴在一次AWK'ing多个输入文件以下解决方案:使用AWK处理来自多个文件输入
$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1
这种运作良好,但我在想,如果我一个人可以向我解释为什么?我发现AWK语法有点难以掌握,希望有人不介意为我打破代码片段。
很多人非常有帮助张贴在一次AWK'ing多个输入文件以下解决方案:使用AWK处理来自多个文件输入
$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1
这种运作良好,但我在想,如果我一个人可以向我解释为什么?我发现AWK语法有点难以掌握,希望有人不介意为我打破代码片段。
awk 'FNR==NR{a[$1]=$2 FS $3;next}
这里我们处理第一个输入(file2)。说,FS是空间,我们建立一个数组(a
),索引是column1,值是column2 " " column3
FNR==NR and next
表示,这部分代码只对file2有效。你可以GAWK男人检查什么是NR和FNR
{ print $0, a[$1]}' file2 file1
当NR != FNR
它的时间来处理第二输入,文件1。这里我们打印file1的行,并以column1作为索引,找出数组(a)中的值print。换句话说,file1和file2在两个文件中都由column1连接。
为NR和FNR,不久,
1st input has 5 lines
2nd input has 10 lines,
NR would be 1,2,3...15
FNR would be 1...5 then 1...10
你看到FNR==NR
检查的伎俩。
我发现在谷歌这个问题/答案,这似乎是参照了另一个问题(How to merge two files using AWK?)发现了一个很具体的数据集。接下来是我正在寻找的答案(而且我认为大多数人会这样做),即仅使用AWK连接来自两个不同文件的每一行。虽然你很可能使用一些UNIX工具一样加入或贴,AWK显然更加灵活和强大,如果您想要的输出是不同的,通过使用如果陈述,或改变OFS(这可能是更难以视实用程序执行;见下文),例如,改变在一个更富于表现力的方式输出(用于壳脚本人员考虑的重要因素)
对于简单的行由行级联:
awk 'FNR==NR { a[FNR""] = $0; next } { print a[FNR""], $0 }' file1 file2
。
这通过使用隐式类型转换来模拟数字索引数组(AWK只有关联数组)的功能。这是相对表达和易于理解。
使用两个文件名为Test1和TEST2具有以下行:
测试1:
line one
line two
line three
测试2:
line four
line five
line six
我得到这样的结果:
line one line four
line two line five
line three line six
取决于何如果要连接输出中各列之间的值,可以选择适当的输出字段分隔符。这是一个椭圆的例子(...)分离柱:
awk 'BEGIN { OFS="..."} FNR==NR { a[(FNR"")] = $0; next } { print a[(FNR"")], $0 }' test1 test2
屈服这样的结果:
line one...line four
line two...line five
line three...line six
我至少希望这激发你所有采取AWK的强大功能!
如果目标只是并排连接列,那么使用'paste'命令非常简单。 – biocyberman 2015-10-21 18:10:18
肯特,优秀的解释;非常感谢你。我没有意识到'FNR == NR'正在形成一种'if'陈述。这正是我需要向前迈进的。非常感谢您花时间帮助! – jkovba 2013-02-20 16:58:10