使用awk将一个文件中的列替换为另一个文件中的列?

时间:2011-10-21 07:49:17

标签: replace awk

我有两个文件:

f1:
111 aaa 444
222 bbb 555
333 ccc 666

f2:
111 333 000 444
222 444 111 555
333 555 555 666

如何使用awk替换“f1”中的第二列,使用“f2”中的第三列?

1 个答案:

答案 0 :(得分:27)

<强>尝试:

awk 'FNR==NR{a[NR]=$3;next}{$2=a[FNR]}1' f2 f1

<强>输出:

111 000 444
222 111 555
333 555 666

上述代码的说明:

  • FNR==NR允许您一次处理一个完整的文件。在这种情况下,它是文件f2NRFNR都包含行号,当读取新文件时,FNR的差异将重置为1,NR继续递增。
  • 当我们使用f2文件时,我们正在创建一个名为a的数组,使用行号(NR)作为key和第三列({{1} }}作为值。 $3允许我们跳过动作块的其余部分。
  • next文件结束后,我们开始处理f2文件。 f1条件不会变为错误,因为NR==FNR将从1开始递增,而FNR则不会。因此,只有第二个动作块NR将被处理。
  • 这个块的作用是通过查找行号将第二列值重新分配给数组值。
  • 最后
  • {$2=a[FNR]}打印出该行。它返回true,并且在1真实语句中导致行的打印。
  • awk是定义文件的顺序。由于我们想要从文件f2 f1创建一个数组,我们先把它放在第一位。