2012-12-18 110 views
1

我想選擇一些字符串使用awk,但我沒有得到什麼,我想awk的多個條件命令

我擁有的數據是這樣的

name1 condition1 
name2 condition2/condition1 
name3 CONDITION3 
name4 condition1/condition4 
name5 CND1 
name6 condition6 
name7 cnd1 
name8 condition3/cnd1 
name9 CND1/condition2 

我想列不管它的位置和字母的大小寫,選擇condition1和cnd1。

我要輸出到像(條件1和CND1與任何組合)

name2 condition2/condition1 
name4 condition1/condition4 
name8 condition3/cnd1 
name9 CND1/condition2 

和另一個輸出看起來像(條件1和CND1 ALONE)

name1 condition1 
name5 CND1 
name7 cnd1 

我用這命令

awk 'BEGIN{IGNORECASE=1} $2 ~ /^cnd1$/ || /^condition1$/' directory/file.tab 

此命令正在消除所有組合。

如何爲此創建正確的命令?

回答

3

您需要在||表達式的第二部分重複$2 ~

awk 'BEGIN{IGNORECASE=1} $2 ~ /^cnd1$/ || $2 ~ /^condition1$/' 

或者使用正則表達式|操作:

awk 'BEGIN{IGNORECASE=1} $2 ~ /^(cnd|condition)1$/' 

對於與任何東西結合第一種情況下,條件1和CND1,試試這個:

awk 'BEGIN{IGNORECASE=1} $2 ~ /(cnd|condition)1/ && $2 ~ "/"' 
+0

甜!感謝約翰,我的問題的第二部分已經解決了。你知道我可以使用什麼命令來獲得組合嗎?我無法真正找到正確的表達方式來告訴Linux! (注意,我試圖得到沒有「condition1或cnd1」的組合) – Error404

+0

你好約翰,我沒有選擇答案,因爲我再次通過數據....名稱的名稱,我發現這些問題:1-一些條件1 - 條件3由空格分隔,有時由( - )分隔。所以我唯一解決這個問題的方法就是說(對不起,我打算用英語說)!「通過列搜索,排除」^ cnd1 $「,」^ condition1 $「(單獨),無論大小寫排除任何不包含任何字符串「cnd1」和condition1的字符串,我認爲這將是一個很長的命令,但這是我唯一的出路,謝謝 – Error404

1

如果你正在寫文件,您可以一次完成:

awk ' 
    BEGIN {IGNORECASE=1} 
    $2 ~ /\<(cnd|condition)1\>/ { 
     if ($2 ~ /\//) 
      print > combined_cnd1 
     else 
      print > only_cnd1 
    } 
' 

注意使用字邊界\<\>來防止「ACND1」和「condition11」之類的錯誤匹配

+0

感謝您對條件語句 – Error404

+0

的瞭解IGNORECASE是GNU-awk特有的,如果你想刪除這個限制,你可以擺脫BEGIN部分並測試'tolower($ 2)'。不確定哪些awk支持\ < and \>,但它不會是全部他們,雖然GNU awk的確如此,只要你堅持gawk。 –