如何使用awk映射子字符串?

时间:2015-10-27 01:56:20

标签: bash shell awk

下面有两个文件,File1是可变长度分隔的,但它们之间有一个空格。我想比较File1到File2的第3到第8位,在匹配字段后,File2的第2列将映射到File1的第21到第25位(前导零/秒)。如果没有匹配,请将其映射到第3到第8位(条带零)。

注意:保留格式。

File1中

40001234000   00000078901
40004567000   00000078901
40001537000   00000078901

文件2

1234 XXXX
1537 YYY

输出:

40001234000   0000000XXXX
40004567000   00000004567
40001537000   00000000YYY

我试过这个但它似乎没有用。

awk 'NR==FNR { map[$1] = $2; next } { key = substr($0,3,6); sub(/^0+/, "", key); emrfil = substr($0,21,5); emrfil = (key in map ? map[key] : key) OFS emrfil; print}' File2 File1

2 个答案:

答案 0 :(得分:0)

这是一个快速解决方案。首先提供file2。

 $ awk 'NR==FNR{a[$1]=$2;next}  
               {k=substr($1,5,4)} 
         k in a{$0=substr($0,0,length-5) 
                   substr("00000",0,5-length(a[k]))a[k]}1' file2 file1

40001234000   0000000XXXX
40004567000   00000078901
40001537000   00000000YYY

请注意,即使第二行不匹配,也会修改第二行。也许使用printf有更好的方法0填充。

答案 1 :(得分:0)

awk 'NR==FNR{a[$1]=$2;next}{b=+substr($1,3,6);x=a[b]?a[b]:b;$2=gensub("0*(.{11}$)","\\1",1,"0000000000"x)}1' file2 file1
40001234000 0000000XXXX
40004567000 00000004567
40001537000 00000000YYY

使用gawk