如何从2个不同的文件中提取字段并使用shell脚本存储在输出文件中?

时间:2014-11-11 14:54:48

标签: shell awk

我发现以下命令有效。但有人可以解释一下它实际上做了什么吗?

awk 'NR==FNR{a[NR]=$2; next} {print a[FNR], $2}' file1 file2

它从文件中提取命令中传递的字段,并将其显示在终端中。

1 个答案:

答案 0 :(得分:1)

awk 'NR==FNR{a[NR]=$2; next} {print a[FNR], $2}' file1 file2

由于NR代表当前输入文件中的记录数和记录号的FNR,因此在处理第一个文件时它们是相等的。因此,awk 'NR==FNR { things1; next } { things2 }' file1 file2表示:

  • 处理第一个文件时执行things1
  • 处理第二个文件时执行things2

a[NR]=$2; next表示:

  • 将第二个字段存储在数组a[]中,索引为记录数(行数,通常,就像这种情况一样)。

print a[FNR], $2表示:

  • 打印上一个文件中相应的存储字段以及当前文件中的第二个字段。

这样,这将产生一个输出,包括两个文件的第二个字段,并排。

测试

$ cat f1
1 2 3
4 5 6
7 8 9
10 11 12
$ cat f2
a1 a2 a3
a4 a5 a6
a7 a8 a9
a10 a11 a12
$ awk 'NR==FNR{a[NR]=$2; next} {print a[FNR], $2}'  f1 f2
2 a2
5 a5
8 a8
11 a11

您可以在Idiomatic awk中找到更多信息。