2014-03-12 38 views
1

我一直在用awk搞亂並試圖讓bash更舒服。我對你的問題是,我怎麼可以在一個文本文件如:Bash I/O打印記錄與匹配字段

5555 
5554 No-match 
5555 Match1 
2421 No-match 
5552 No-match 
5555 Match2 
5555 Match3 

和掃描的第一條記錄的第一個字段($ 1)(在這種情況下:5555),然後做每個剩餘搜索如果$ 1匹配,則記錄並打印第二個字段($ 2)。這是我寫的:

awk '{(NR==1)(id=$1) (NR>1)(if(id==$1))printf("%s\n",$2)}' 

我很難找到一種方法來測試第一個之後的所有記錄。我認爲:

(NR>1)(if(condition))(action) 

會導致它執行我想要的記錄> 1但是這似乎並不是這種情況。任何幫助將是偉大的!

+0

的列不是由製表符分隔,簡單的空間。此外,我正在處理的文件是在Unix中生成的,因此應該沒有問題。 – qorz

回答

1

試試這個:

awk 'NR==1 {id=$1} NR>1 {if (id==$1) printf("%s\n",$2)}' 

在awk語句組成的圖案,然後行動。行動應該在大括號中。所以在這裏我們有兩個陳述。首先,如果我們在第一行上,拍攝第一場:

NR==1 {id=$1} 

然後,在每行,但第一,第一場比較捕獲的值,並打印第二場,如果他們匹配:

NR>1 {if (id==$1) printf("%s\n",$2)} 
+0

非常感謝!您的解釋清晰簡潔。 – qorz

+0

@qorz你應該把答案標記爲例外,如果它有效。要將答案標記爲已接受,請點擊答案旁邊的複選標記以將其從灰色切換到填充。 – Donal

2

你非常接近。嘗試:

awk 'NR==1{id=$1}NR>1&&id==$1{printf("%s\n",$2)}' file 
0
awk 'NR==1{id=$1}; NR>1{ if ($1==id) {print $2 }}' TestFile 
Match1 
Match2 
Match3 
+0

所有優秀的解決方案! ; - ) – shellter