bash - 如何用另一个文件的映射值替换 csv 文件中的第 n 个字段?

标签 bash csv sed awk

我有一个以下格式的 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 文件并将数据保存在一个关联数组中,该数组与字段 234 进行比较 来自 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/

相关文章:

json - 如何读取服务状态并通过 bash 中的 JSON 将其传递到 Slack

linux - 如何创建备份脚本来比较日期和删除最旧的文件

regex - 在 grep 中使用星号

csv - 指向带有嵌入双引号的 CSV 文件的 Hive 外部表

bash - sed 脚本 - 临时文件的权限被拒绝

java - Hadoop单节点集群报错

c - 根据上下文删除文本文件中的一行文本

python - pandas:read_csv仅排除某些行

regex - SED:同一行上有多个模式,如何匹配/解析第一个

sed - 如何将 sed 模式与 : 匹配