2016-08-30 44 views
-2

假設我有一個文件的內容如下。確定文件所有行中的給定列是否符合條件

ok  yes bad 
ok  yes good 
ok  yes bad 
ok  yes good 
ok  yes bad 
ok  yes good 

我需要寫一個shell腳本或者awk程序搜索整個第3列,如果整列好,然後打印爲「寄託都看起來不錯」和櫃面如果發現任何壞然後打印爲「事不好嗎?」

+4

有哪些你到目前爲止已經試過? – John1024

回答

2

用一個簡單的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並打印相關消息。

+0

意圖是掃描整個文件。你想要設置一個標誌並在END塊中打印。 –

+0

@jean:但它打印多次。我希望awk搜索整個列,如果整列的值爲「好」,那麼它只能打印一次,在這種情況下,它會打印多次。 – suru1432002

+0

@ suru1432002,請注意編輯 - 現在就這樣做。 –

0
$ 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,以瞭解如何以簡潔,高效,健壯和便攜的方式進行操作。

0

你可以這樣做:

awk '$3=="bad"{bad++} END { if (bad>0) print bad " bads found"; else print "all goods!"}' file