我有一个以下格式的 csv 文件:
23:56:00,5,1,7,99,100,101
23:56:30,5,1,7,98,199,191
23:57:00,6,1,6,99,99,98
23:57:30,5,2,6,97,99,199
...
以及以下格式的 map 文件:
1:10
2:12
3:30
4:aa
5:16
6:11
7:bb
我想要完成的是用映射文件中映射到的值替换第一个 csv 文件中第 2、3 和 4 列中的字段。
例如在上面的例子中,我想要的最终输出是这样的:
23:56:00,16,10,bb,99,100,101
23:56:30,16,10,bb,98,199,191
23:57:00,11,10,11,99,99,98
23:57:30,16,12,11,97,99,199
执行此操作的最佳方法是什么?我试图找出一种使用 awk/sed 的方法,但我不确定如何在 awk 中访问多个文件,以及这是否是最好的方法。因为它是一个大文件,所以会有很多重复,所以我不认为每次检查映射都是正确的方法。
有没有办法将映射存储到 shell 脚本中的哈希表中,然后使用 HashMap 进行替换?
最佳答案
尝试:
awk '
BEGIN { FS = OFS = "," }
FNR == NR {
split($0, f, /:/)
map[f[1]] = f[2]
next
}
{
for (i=2; i<=4; i++) {
if ($i in map) { $i = map[$i] }
}
}
{ print }
' mapfile csvfile
它首先读取 map 文件并将数据保存在一个关联数组中,该数组与字段 2
、3
和 4 进行比较
来自 csv
文件。结果产生:
23:56:00,16,10,bb,99,100,101
23:56:30,16,10,bb,98,199,191
23:57:00,11,10,11,99,99,98
23:57:30,16,12,11,97,99,199
关于bash - 如何用另一个文件的映射值替换 csv 文件中的第 n 个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19785434/