AWK关联数组,映射

时间:2014-01-14 03:16:59

标签: awk mapping associative-array

假设我有两个文件:

file1 - map.txt

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

file2 - relation.txt

178246, 289789
384275, 178246
384275, 869282

预期结果如下:

1, 2
3, 1
3, 4

但是我使用以下代码获得的结果是:

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

  2,
  1,
  4,

当我在map.txt中交换列时,我感到很困惑:

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

relation.txt不会改变

结果变成了:

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

1,
3,
3,

{$ 1 =地图[$ 1]; $ 2 =地图[$ 2];打印$ 0}

附近似乎有问题

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

删除第2列中两个文件中的前导空格。

为了FS而帮自己一个忙,转而使用除逗号以外的内容。 Tab char很好,因为大多数输入屏幕使用tab移动到下一个字段,因此它不应该在您的数据中。 |字符很好,因为它是可视的,不太可能出现在你的输入中。

您可以构建一个“陷阱”来查找没有正确数量的字段的记录,如下所示:

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

IHTH