AWK关联数组,映射或哈希映射

3
假设我有两个文件:
文件1 - 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=map[$1];$2=map[$2];print $0}附近出了些问题。


如果我使用一些真实的名字,比如Tony、Jerry和Frank代替uid 178246、289789等,我的代码就可以完美地工作。我不知道为什么在把数字作为关联数组索引时,代码就无法正常运行。 - cxstam
太棒了!它有效了。我使用“|”代替“,”,现在它完美地运行了。非常感谢Shellter。 - cxstam
我怎样才能给你一个答案评分呢?哈哈,好棒的回答。 - cxstam
2个回答

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

2

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

并且请自行更改分隔符FS,建议使用制表符,因为大多数输入屏幕都使用制表符来移动到下一个字段,所以它不应该出现在您的数据中。另外,|字符也很好用,因为它具有可视性,而且很少会出现在您的输入中。

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

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

IHTH


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接