AWK associative array, mapping

a 夏天 提交于 2020-01-25 00:47:28

问题


Suppose I have two files:

file1 - map.txt

1, 178246
2, 289789
3, 384275
4, 869282

file2 - relation.txt

178246, 289789
384275, 178246
384275, 869282

Expected results are:

1, 2
3, 1
3, 4

But the results I got using the following code were:

awk 'FNR==NR{map[$2]=$1} {$1=map[$1];$2=map[$2];print $0}' map.txt relation.txt

  2,
  1,
  4,

It was confused when I swapped the columns in map.txt like this:

178246, 1
289789, 2
384275, 3
869282, 4

relation.txt doesn't change

The results became:

awk 'FNR==NR{map[$1]=$2} {$1=map[$1];$2=map[$2];print $0}' map.txt relation.txt

1,
3,
3,

It seems that something wrong near {$1=map[$1];$2=map[$2];print $0}


回答1:


Remove the leading space in both files in column 2.

And do yourself a favor and switch to something besides commas for FS. The Tab char is good because most input screens use tab to move to the next field, so it shouldn't be in your data. The | char is nice because it is visual and very unlikely to be in your input.

You could build a 'trap' to find records without the right number of fields like this:

awk -F"|" -v expectFldCnt=2 '{
   if (NF==expectFldCnt) { print ":everything OK" ; }
    else { print "ERR: " NF "!=" expectFldCnt  ":" $0 > "errorFile" }
    }' \
  map.txt relation.txt

IHTH




回答2:


awk  -F"[, ]" 'NR==FNR {m[$3]=$1;next};{print m[$1]",",m[$3]}' map.txt relations.txt


来源:https://stackoverflow.com/questions/21105473/awk-associative-array-mapping

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!