2015-02-07 55 views
-1

我有一個輸入文件。 我需要掃描第3列中的第1列和第2列的值/數字,並且如果匹配,則使用相應的$ 4打印$ 1和$ 2,如下面的輸出。 任何幫助表示讚賞。AWK在同一個文件中的列之間查找(類似於vlookup)

要匹配$ 3的第一列,試過這段代碼,但它沒有奏效。 的邏輯是將$ 3放入一個數組中並掃描$ 1。

awk -F ',' '{a[$3] } { if ($1 in a) {print $1":" $4 } else {print $1, "NA"} }' 1.csv 

輸入

345,1314,567,index-1 
344,1315,566,index-2 
343,1316,565,index-3 
342,1317,1316,index-4 
241,1318,563,index-5 
340,1319,562,index-6 
439,1320,561,index-7 
318,1333,337,index-8 
337,1335,559,index-9 
236,1336,558,index-10 
,,311,index-11 
,,1314,index-12 
,,1333,index-13 
,,3444,index-14 
,,344,index-15 
,,2008,index-16 
,,342,index-17 
,,1320,index-18 
,,543,index-19 
,,340,index-20 
,,12233,index-21 

輸出

345:#N/A 
344:index-15 
343:#N/A 
342:index-17 
241:#N/A 
340:index-20 
439:#N/A 
318:#N/A 
337:index-8 
236:#N/A 
1314:index-12 
1315:#N/A 
1316:index-4 
1317:#N/A 
1318:#N/A 
1319:#N/A 
1320:index-18 
1333:index-13 
1335:#N/A 
1336:#N/A 
+0

您的文字和您的示例不同意。請澄清你想要什麼,並顯示你迄今爲止嘗試過的。 – John1024 2015-02-07 20:51:22

+0

對於令人困惑的解釋感到抱歉,示例輸入和輸出是有效的。我試圖匹配開始時的第一列,但仍然需要一個大help.awk -F',''{a [$ 3]} {if($ 1 in a ){print $ 1 $ 4「:」} else {print $ 1,「NA」}}'1.csv – 2015-02-07 21:00:48

+0

你試過了什麼?當您不包含代碼時,很難幫助您處理代碼。 [把它放在你的問題](http://stackoverflow.com/posts/28387099/edit),不只是一個評論。 – ghoti 2015-02-07 21:03:31

回答

0
$ cat nash.awk 
NR == FNR { a[$3] = $4; next }  
($1 in a) { print $1 ":" a[$1] } 
($2 in a) { print $2 ":" a[$2] } 
$1 && !($1 in a) { print $1 ": #N/A"}  
$2 && !($2 in a) { print $2 ": #N/A"} 

請注意,我們所提供的文本文件兩次作爲awk腳本進行兩​​遍(見下文說明):

$ awk -F, -f nash.awk nash.txt nash.txt 

1314:index-12 
345: #N/A 
344:index-15 
1315: #N/A 
1316:index-4 
343: #N/A 
342:index-17 
1317: #N/A 
241: #N/A 
1318: #N/A 
340:index-20 
1319: #N/A 
1320:index-18 
439: #N/A 
1333:index-13 
318: #N/A 
337:index-8 
1335: #N/A 
236: #N/A 
1336: #N/A 

說明:

NR == FNR { a[$3] = $4; next } 

當NR == FNR我們知道我們正在閱讀的第一次文件。這裏我們保存對應於$3的所有$4值。 next表示我們跳過所有更多的命令。

($1 in a) { print $1 ":" a[$1] } 

如果我們在這裏,我們知道我們正在第二次閱讀文件。檢查字段1是否與任何字段3匹配,如果是,則與上面步驟中保存的字段4一起打印。

($2 in a) { print $2 ":" a[$2] } 

同上,但是對於第二個字段。

$1 && !($1 in a) { print $1 ": #N/A"}  

類似地,如果第一字段是發現,打印N/A的消息。

$2 && !($2 in a) { print $2 ": #N/A"} 

與上述第二欄相同。

相關問題