2014-01-14 132 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