2014-01-14 115 views
0

假设我有两个文件:AWK关联数组,映射

文件1 - 的map.txt

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

文件2 - 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}附近似乎有什么错误

+0

如果我使用像托尼,杰里一些真实姓名,坦率地说,而不是用户代码178246,289789等,我的代码完美工作,我不知道为什么它不起作用,当我使用数字而不是字符串作为关联数组的索引 – cxstam

+0

太棒了!我用“|”而不是“,”它完美的作品。非常感谢Shellter。 – cxstam

+0

我该如何给你答案分数?大声笑,一个很好的答案 – cxstam

回答

1

在这两个文件中的第2列

删除前导空间,请你帮个忙,并切换到的东西,除了逗号为FS。 Tab字符很好,因为大多数输入屏幕使用Tab移动到下一个字段,所以它不应该在您的数据中。 | char很好,因为它是可视的,不太可能在你的输入中。

你可以不喜欢这个正确的号码字段建立一个“陷阱”,以查找记录:

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

IHTH

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