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

ego*_*ulz 2 csv bash awk sed

我有一个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
...
Run Code Online (Sandbox Code Playgroud)

以及以下格式的地图文件:

1:10
2:12
3:30
4:aa
5:16
6:11
7:bb
Run Code Online (Sandbox Code Playgroud)

我想要完成的是将第一个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
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?我试图找出一种使用awk/sed的方法,但我不知道如何访问awk中的多个文件,如果这是最好的方法.由于它是一个大文件,因此会有很多重复,因此我不认为每次检查映射是正确的方法.

有没有办法将地图存储到shell脚本内的哈希表中,然后使用哈希映射替换?

Bir*_*rei 5

试试:

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
Run Code Online (Sandbox Code Playgroud)

它读取地图第一文件和在与场比较关联数组保存数据2,34从所述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
Run Code Online (Sandbox Code Playgroud)