【发布时间】:2025-12-26 02:40:09
【问题描述】:
我有两个文件:
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”中的第三列?
【问题讨论】:
我有两个文件:
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”中的第三列?
【问题讨论】:
试试:
awk 'FNR==NR{a[NR]=$3;next}{$2=a[FNR]}1' f2 f1
输出:
111 000 444
222 111 555
333 555 666
上面代码的解释:
FNR==NR 允许您一次处理一个完整的文件。在这种情况下,它是文件f2。 NR 和 FNR 都包含行号,不同之处在于 FNR 在读取新文件时重置为 1,而 NR 继续递增。 f2 文件时,我们正在创建一个名为a 的数组,使用行号(NR) 作为key,第三列($3) 作为值。 next 允许我们跳过操作块的其余部分。 f2 文件结束,我们就开始处理f1 文件。 NR==FNR 条件不会变为 false,因为 FNR 将从 1 递增,NR 不会。所以只会处理第二个动作块{$2=a[FNR]}。 1 打印该行。它返回 true,并且在 awk true 语句中会打印该行。 f2 f1 是定义文件的顺序。因为我们想从文件f2 创建一个数组,所以我们把它放在第一位。 【讨论】:
-F, 选项尝试了相同的命令,但在这种情况下输出文件没有逗号。有什么办法解决这个问题?
-vOFS=, 传递给 awk。 OFS 是输出字段分隔符。 (您可以在 BEGIN 块内的 awk 程序中执行相同的操作:ala BEGIN{OFS=","})