2015-02-24 115 views
2

我有兩個文件 文件a.txt中(組名;羣ID)文件比較

wheel:1 
www:2 
ftpshare:3 
others:4 

文件B.txt(用戶名:用戶名:羣ID)

pi:1:1 
useradmin:2:3 
usertwo:3:3 
trout:4:3 
apachecri:5:2 
guestthree:6:4 

我需要創建一個輸出,其中它顯示用戶名:用戶ID:組名等如下

pi:1:wheel 
useradmin:2:ftpshare 

(等)

這需要使用awk for unix類來完成。花了無數小時試圖弄清楚這是我想出來的。

awk -F ':' 'NR==FNR{ if ($2==[a-z]) a[$1] = $4;next} NF{ print $1, $2, $4}' fileA.txt fileB.txt 

OR

awk -F, 'NR==FNR{ a[$2]=$2$1;next } NF{ print $1, $2 ((a[$2]==$2$3)?",ok":",nok") }' FileA.txt FileB.txt 

有人可以幫我想出解決辦法,以獲得正確的輸入,並解釋給我什麼我做錯了。

+0

我並不想成爲討厭的,但它看起來像你不知道你在做什麼,或者AWK的語法。也許看這裏會幫助http://www.grymoire.com/Unix/Awk。html – 2015-02-24 10:50:11

+0

完全沒問題,謝謝目前這個偉大的網站;) – snippytroup 2015-02-24 16:36:38

回答

2

您可以使用AWK:

awk 'BEGIN{FS=OFS=":"} FNR==NR{a[$2]=$1; next} $3 in a{print $1, $2, a[$3]}' a.txt b.txt 
pi:1:wheel 
useradmin:2:ftpshare 
usertwo:3:ftpshare 
trout:4:ftpshare 
apachecri:5:www 
guestthree:6:others 

它是如何工作的:

  • BEGIN{FS=OFS=":"} - 使輸入和輸出域分隔結腸
  • FNR==NR - 執行此塊fileA
  • {a[$2]=$1; next} - 創建關聯ar射線a與密鑰作爲$2和值作爲$1,然後跳到下一個記錄
  • $3 in a - 如果$3在陣列發現a
  • print $1, $2, a[$3]打印FIELD1,FIELD2並a[field3]
+1

也可以做'{$ 3 = a [$ 3]} 1' – 2015-02-24 10:55:30

+0

你會更短,謝謝@JID – anubhava 2015-02-24 10:59:18

+0

謝謝@anubhava可以解釋FNR == NR {A [$ 2] = $ 1;下一個}和{3美元{print $ 1,$ 2,a [$ 3]} – snippytroup 2015-02-24 16:35:27

0

執行此塊用於第二文件我知道你說你想使用awk,但你也應該考慮爲這樣的任務設計的標準工具,即join。這裏是你可以應用的一種方式:

join -o '2.1 2.2 1.1' -t: -1 2 -2 3 <(sort -t: -k2,2n fileA.txt) \ 
            <(sort -t: -k3,3n fileB.txt) 

由於輸入到join需要在加入場進行排序,這種方法離開輸出無序的,如果這是重要的用途anubhava's答案。

輸出在這種情況下:

pi:1:wheel 
apachecri:5:www 
trout:4:ftpshare 
useradmin:2:ftpshare 
usertwo:3:ftpshare 
guestthree:6:others