2016-09-03 102 views
0

在下面的awk我想打印出匹配的行具有字符串中的製表符分隔的輸入FPRFP$2。如果在$2中找到匹配,則在result中只打印file中沒有這些關鍵字的行。同時打印另一個文件removed,其中包含那些關鍵字。當我嘗試打印兩個文件時,awk有語法錯誤,如果我只打印一個awk運行。謝謝 :)。AWK輸出兩個文件的基礎上匹配或不匹配

輸入

12  aaa 
123 FP bbb 
11  ccc 
10 RFP ddd 

結果

12  aaa 
11  ccc 

除去

123 FP bbb 
10 RFP ddd 

AWK

awk -F'\t' 'BEGIN{d["FP"];d["RFP"]}!($2 in d) {print > "removed"}; else {print > "result"}' file 
awk: cmd. line:1: BEGIN{d["FP"];d["RFP"]}!($2 in d) {print > "removed"}; else {print > "result"} 
awk: cmd. line:1:              ^syntax error 

回答

4

else去與if。您的腳本沒有if,只是else,因此語法錯誤。所有你需要的是:

awk -F'\t' '{print > ($2 ~ /^R?FP$/ ? "removed" : "result")}' file 

,或者如果你喜歡的陣列接近你要使用:

awk -F'\t' ' 
    BEGIN{ split("FP RFP",t,/ /); for (i in t) d[t[i]] } 
    { print > ($2 in d ? "removed" : "result") } 
' file 

讀過書的有效AWK編程,第4版,由阿諾德·羅賓斯學習awk的語法和語義。

順便說一句,如果寫像你/別人的代碼顯示在你的問題時:

if (!($2 in d)) removed; else result 

想想自己在使用負(!)邏輯,這使得你的代碼難於馬上理解並打開你的事實直到潛在的雙重否定。總是試圖表達一種積極的方式每個條件,在這種情況下會是:

if ($2 in d) result; else removed 
+1

非常感謝您的幫助和解釋,我只是有點'有效awk中Programming'並已開始閱讀它:) – Chris