使用awk将一个文件中的列替换为另一个文件中的列?
Posted
技术标签:
【中文标题】使用awk将一个文件中的列替换为另一个文件中的列?【英文标题】:Replace column in one file with column from another using awk? 【发布时间】:2011-12-12 09:17:15 【问题描述】:我有两个文件:
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】:试试:
awk 'FNR==NRa[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
创建一个数组,所以我们把它放在第一位。
【讨论】:
@saloua 我添加了一些解释。希望有帮助! 我的用例略有不同(仅略有不同)。不同之处在于我有一个逗号分隔的文件 f1 和 f2 而不是空格分隔。我使用-F,
选项尝试了相同的命令,但在这种情况下输出文件没有逗号。有什么办法解决这个问题?
@Ganesh(我知道这很旧,但是……)将参数 -vOFS=,
传递给 awk。 OFS 是输出字段分隔符。 (您可以在 BEGIN 块内的 awk 程序中执行相同的操作:ala BEGINOFS=","
)以上是关于使用awk将一个文件中的列替换为另一个文件中的列?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过将csv文件与python中的其他csv文件进行比较来删除和替换csv文件中的列?