【问题标题】:AWK associative array, mapping or hash mapAWK 关联数组、映射或哈希映射
【发布时间】:2014-01-14 03:16:58
【问题描述】:

假设我有两个文件:

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=map[$1];$2=map[$2];print $0} 附近似乎有问题

【问题讨论】:

  • 如果我使用一些真实姓名,如 tony、jerry、frank 而不是 uid 178246、289789 等,我的代码运行良好,我不知道为什么当我使用数字而不是字符串作为关联数组的索引
  • 太棒了!它的工作原理。我用“|”而不是“,”,它工作得很好。非常感谢 Shellter。
  • 我怎样才能给你一个答案分数?大声笑,一个很好的答案

标签: awk mapping associative-array


【解决方案1】:
awk  -F"[, ]" 'NR==FNR {m[$3]=$1;next};{print m[$1]",",m[$3]}' map.txt relations.txt

【讨论】:

    【解决方案2】:

    删除第 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      相关资源
      最近更新 更多