2012-07-10 176 views
0

我正在awk中做文件遍歷。這方面的一個例子是awk中的行遍歷

Dat time range column session - 1 
time name place session animal - 2 
hi bye name things - 3 

在這兩者中。我需要逐行遍歷,並且需要在包含session的行中逐字地遍歷。

因此,在這種情況下,我需要到達第1行和第2行,因爲它包含單詞會話,而不是第3行,因爲它不包含該字段(從這個意義上說,我可以跳過這一點)。從那裏我需要逐字地遍歷到會話字段。

我知道$0可以代表整條線。但我的問題是如何在達到線後逐字遍歷。

你能幫我解決這個問題嗎?謝謝。

回答

1

你可以通過電流線$0用該構建體循環:

for(i = 1; i <= NF; i++) print $i 

這使得使用預定義的變量AWK NF其代表在當前行($0)字段的數目。

您可以在遍歷該行時檢查$i的值,並根據該值確定如何處理該值。 E.g,打印,跳過它,等if ($i == "session") ...

更新:

您還可以使用match()函數來確定當前行你是處理含有不通過線迭代「會話」字符串。例如,

where = match($0, "session") 
if (where > 0) 
    print "Found session in this line"; 
else 
    print "session not found in this line"; 

注意match()需要一個正則表達式作爲第二個參數,所以你的比賽可以說是相當複雜的。有關此功能和其他awk string functions的更多信息,請參閱此頁面。

+0

謝謝你的親切答案..我會試試這個。 – User 2012-07-10 16:53:41

+2

@用戶,確保你upvote /接受幫助解決你的問題的答案。 – Shahbaz 2012-07-10 21:48:12

1

您可以使用for循環,只有在包含「會話」行過濾:

awk '/session/{ for (i = 1; i <= NF; i++) { \ 
        if ($i == "session") \ 
        do_whatever_here \ 
       } \ 
       }' 

你可以閱讀更多的在這裏這些指令:forstring comparisonif

+1

冗餘使用grep。不要這樣做。 – ghoti 2012-07-11 00:32:49

+0

事實上:'awk'/ session/{for ...}'your_file'。你也可以刪除不需要的行延續。 – 2012-07-11 03:30:55

+0

@glennjackman,謝謝。實際上我只是在學習awk。假設這是寫在一個終端(而不是腳本)中的'\\'。 – Shahbaz 2012-07-11 07:53:58