2012-03-29 15 views
1

我真的不想再浪費人們的時間,並要求這一點,但後2小時和跑步了我自己的時間,我已經決定要問..重置的變量新的生產線的awk

基本上我有格式爲:

word: other words; more words here; last word 
word: more words here; last word 
(etc) x 100 

其中可能出現其他詞/多個詞可以是零個或多個。

我的目標是統計次數';'每行發生一次,然後在行首開始打印。

我的邏輯是,使用awk作爲';'的正則表達式。並在每次出現時增加一個變量,然後打印該變量。

目前我有:(?順便說一句我怎麼把我的代碼,就像一個陰影中...)

awk ' /;/ {n=n+1} {print n " " $0}' a.txt 

但是我變得撤消的,當AWK在讀我的「N」不復位下一行。 如何在awk移到下一行時重置n? 我試着設置v = NR,如果v!= NR,那麼n = 0,但我無法做到這一點。

我也有一個最後的問題,我如何設置一個變量等於一個正則表達式?

感謝堆,

回答

3

好得多浪費我的生命一分鐘比你的一百二十:-)

您可以只使用字段分隔符做到這一點:

pax> echo 'word: other words; more words here; last word 
word: more words here; last word' | awk 'BEGIN {FS=";"}{print NF"> "$0}' 

3> word: other words; more words here; last word 
2> word: more words here; last word 

基本上,將字段分隔符FS設置爲分號,以便根據需要設置字段數NF。然後打印出NF變量以及整個行$0


而且你可以通過在每行前加四個空格來獲得代碼塊。當您提出問題時,框右上方會出現一個橙色問號 - 點擊該問題,會出現一些菜單驅動的格式幫助。


至於你的最後一個問題,你(轉述)評論增強:

我也有最後一個問題,我該如何設置一個變量等於一個正則表達式?我想設置一個變量等於':'之前的所有文本(所以正則表達式是爲了隔離'單詞')。

爲此,您可以抓取第一個字段的副本並對其執行替換。我多行的awk命令,因爲他們正在變得越來越複雜,這使得他們更容易閱讀,但你可以把它全部在同一行,如果你想:

pax> echo 'xyzzy: other words; more words here; last word 
plugh: more words here; last word' | awk ' 
    BEGIN {FS=";"} 
    { xx = $1; 
     gsub (/:.*/, "", xx); 
     print NF" ("xx") > "$0 
    }' 
3 (xyzzy) > word1: other words; more words here; last word 
2 (plugh) > word2: more words here; last word 

gsub (/:.*/, "", xx)會簡單地替換正則表達式:.*(冒號後面跟着任何內容),而變量xx沒有任何內容。

+0

謝謝,很好地工作:-) – Max 2012-03-29 13:01:00

+0

爲了響應您的最後一點,如果我想設置一個變量等於正則表達式,然後打印它。正則表達式在':'之前都是文本(所以正則表達式是爲了隔離'單詞')並且想要設置一個等於此的變量。我會怎麼樣? – Max 2012-03-29 13:09:24

+0

@Max,請參閱更新。 – paxdiablo 2012-03-29 13:23:32