假設我有一個文件的內容如下。確定文件所有行中的給定列是否符合條件
ok yes bad
ok yes good
ok yes bad
ok yes good
ok yes bad
ok yes good
我需要寫一個shell腳本或者awk程序搜索整個第3列,如果整列好,然後打印爲「寄託都看起來不錯」和櫃面如果發現任何壞然後打印爲「事不好嗎?」
假設我有一個文件的內容如下。確定文件所有行中的給定列是否符合條件
ok yes bad
ok yes good
ok yes bad
ok yes good
ok yes bad
ok yes good
我需要寫一個shell腳本或者awk程序搜索整個第3列,如果整列好,然後打印爲「寄託都看起來不錯」和櫃面如果發現任何壞然後打印爲「事不好嗎?」
用一個簡單的AWK一個班輪條件就做:
awk 'BEGIN {ok=1;} $3=="bad" { ok=0 } END { if (ok==0) {print "Things are not okay"} else { print "Everything looks good"} }' yourfile
BEGIN
塊初始化文件解析開始前ok
1。默認值:除非發現錯誤,否則一切正常。
您的文件具有自然空間/製表符分隔,無需調整awk字段分隔符:$3
直接是我們需要的第三個字段。只需測試是否在某處遇到bad
,如果是,則取消ok標誌。
END
塊在文件的末尾執行。檢查ok
並打印相關消息。
意圖是掃描整個文件。你想要設置一個標誌並在END塊中打印。 –
@jean:但它打印多次。我希望awk搜索整個列,如果整列的值爲「好」,那麼它只能打印一次,在這種情況下,它會打印多次。 – suru1432002
@ suru1432002,請注意編輯 - 現在就這樣做。 –
$ awk '$3=="bad"{f=1; exit} END{print (f ? "Things are not OK" : "Everything looks good")}' file
Things are not OK
上面設置一個標誌和exist
S中的主要工作循環(注:exit
不退出的程序,只要是閱讀的輸入隱含的循環,所以後來它把你的END
部分)的第一次發現「不好」,所以儘可能高效,然後在END部分,它使用三元表達式來打印相關消息,該消息基於該標誌是否設置。
如果您將在您的生活中進行任何文字操作,請閱讀Arnold Robbins的第4版Effective Awk Programming,以瞭解如何以簡潔,高效,健壯和便攜的方式進行操作。
你可以這樣做:
awk '$3=="bad"{bad++} END { if (bad>0) print bad " bads found"; else print "all goods!"}' file
有哪些你到目前爲止已經試過? – John1024