linux - 如何使用 substr 比较替换字段

标签 linux awk sed

我有两个文件,我需要从 F1 中获取 Field-11 的最后 6 个字符并在 F2 上查找,如果它匹配,我需要用 F2 的 Field-1 和 Filed-2 替换 F1 的 Field-9。

文件1:

12345||||||756432101000||756432||756432101000||  
aaaaa||||||986754812345||986754||986754812345||  
ccccc||||||134567222222||134567||134567222222||  

文件2:

101000|AAAA   
812345|20030   

预期的输出是:

12345||||||756432101000||101000AAAA ||756432101000||  
aaaaa||||||986754812345||81234520030||986754812345||  
ccccc||||||134567222222||134567||134567222222||  

我试过:

awk -F '|' -v OFS='|' 'NR==FNR{a[$1,$2];next}  {b=substr($11,length($11)-7)}  b in a {$9=a[$1,$2]}1'

最佳答案

我会以这种方式将其写成文件中的完整脚本,而不是单行代码:

#!/usr/bin/awk -f                                                                                                       

BEGIN {
    FS = "|";
    OFS = FS;
}

NR == FNR { # second file: the replacements to use
    map[$1] = $2
    next;
}

{ # first file specified: the main file to manipulate
    b = substr($11,length($11)-5);
    if (map[b]) {
        $9 = b map[b]
    }
    print
}

关于linux - 如何使用 substr 比较替换字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36929705/

相关文章:

java - 如何在Linux操作系统中从Java调用 "Powershell script file"

c++ - 子进程收到父进程的 SIGINT

regex - 使用 sed 将一个子字符串替换为另一个子字符串

shell - 在单列中打印具有给定单词的所有行?

linux - 如何在 unix 或 linux 中基于 grep、sed 或 awk 获取 unix 目录中的文件名?

string - 用随机数替换文件中的重复数字

linux - 使用带有数值的系统调用有什么意义?

linux - 无法将 python3 内核添加到 Jupyter

awk - 关于awk和整数到ASCII字符的转换

unicode - 使用awk去除字节顺序标记