將每行后面都添加一個空行
這是怎么意思呢?一個單行awk命令,其實也是一個用awk語言寫的程序,每個awk程序,都是由一系列的“匹配模式 { 執(zhí)行動作
}”語句所組成的。在這個例子里面,有兩個語句,“1”和“{print
""}”。在每個“匹配模式——執(zhí)行動作”語句中,模式和動作都是可以被省略的。如果匹配模式被省略,那么預(yù)定的動作將會對輸入文件的每一行執(zhí)行。如果動
作被省略,那么就默認會執(zhí)行
動作只有在匹配模式的值為真的時候才會執(zhí)行。因為“1”永遠為真,所以,這個例子也可以寫成下面的形式
awk中每條 添加空行的另一種方法
BEGIN是一個特殊的模式,后面所接的內(nèi)容,會在文件被讀入前執(zhí)行。這里,對ORS變量進行了重新定義,將一個換行符改成了兩個。后面的“1”,同樣等價于 在每個非空的行后面添加空行
這個語句里面用到了一個新的變量, 在每行后添加兩個空行
這一語句與前面的很相似。“1”可以理解為
它首先輸出當前行,然后再輸出一個換行符以及一個結(jié)束print語句的ORS,也就是另外一個換行符。 為每個文件的內(nèi)容添加行號
這個awk程序在每行的內(nèi)容前添加了一個變量FNR的輸出,并用一個制表符進行分隔。FNR(File Number of Row)這個變量記錄了當前行在當前文件中的行數(shù)。在處理下一個文件時,這個變量會被重置為0。 為所有文件的所有行統(tǒng)一添加行號
這一句與上一例基本一樣,除了使用的行號變量是NR(Number of Row),這個變量不會在處理新文件的時候被重置。所以說,如果你有2個文件,一個10行一個12行,那這個變量會從1一直變到22。 用更漂亮的樣式添加行號
這個例子用了printf函數(shù)來自定義輸出樣式,它所接受的參數(shù)與標準C語言的printf函數(shù)基本一致。需要注意的是,printf后不會被自動添加ORS,所以你需要自己指定換行。這個語句指定了行號會右對齊,然后是一個空格和冒號,接著是當前行的內(nèi)容。 為文件中的非空行添加行號
Awk的變量都是自動定義的:你第一次用到某個變量的時候它就自動被定義了。這個語句在每次遇到一個非空行的時候先把一個變量a加1,然后把a的數(shù)值添加到行首,然后輸出當前行的內(nèi)容。 計算文件行數(shù)(模擬 wc -l)
END是另外一個不會被檢驗是否為真的模式,后面的動作會在整個文件被讀完后進行。這里是輸出最終的行號,即文件的總行數(shù)。 對每行求和
Awk有些類似C語言的語法,比如這里的 對所有行所有字段求和
這個例子與上一個基本一致,除了輸出的是所有行所有字段的和。由于變量會被自動定義,s只需要定義一次,故而不需要把s定義成0。另外需要注意的是,它輸出 將所有字段替換為其絕對值
這條語句用了C語言的另外兩個特性,一個是 下面的是將這條語句完整的寫出來的形式。print語句會在行中所有字段被改為正數(shù)后執(zhí)行。
計算文件中的總字段(單詞)數(shù)
這個命令匹配所有的行,并不斷的把行中的字段數(shù)累加到變量total。執(zhí)行完成上述動作后,輸出total的數(shù)值。 輸出含有單詞Beth的行的數(shù)目
這個例子含有兩個語句。第一句找出匹配/Beth/的行,并對變量n進行累加。在/.../之間的內(nèi)容為正則表達式,/Beth/匹配所有含有 “Beth”的單詞(它不僅匹配Beth,同樣也匹配Bethe)。第二句在文件處理完成后輸出n的數(shù)值。這里用n+0是為了讓n為0 的情況下輸出0而不是一個空行。 尋找第一個字段為數(shù)字且最大的行
這個例子用變量max記錄第一個字段的最大值,并把第一個字段最大的行的內(nèi)容存在變量maxline中。在循環(huán)終止后,輸出max和maxline的內(nèi)容。注意:如果在數(shù)字都為負數(shù)的情況下,這個例子就不能用了,下面的是修改過的版本
在每一行前添加輸出該行的字段數(shù)
這個例子僅僅是在逐行輸出字段數(shù)NF,一個冒號,以及該行的內(nèi)容。 輸出每行的最后一個字段
awk里面的字段可以用變量的形式引用。這一句輸出第NF個字段的內(nèi)容,而NF就是該行的字段數(shù)。 打印最后一行的最后一個字段
這個例子用field記錄最后一個字段的內(nèi)容,并在循環(huán)后輸出field的內(nèi)容。 這里是一個更好的版本。它更常用、更簡潔也更高效:
輸出所有字段數(shù)大于4的行
這個例子省略了要執(zhí)行的動作。如前所述,省略動作等價于 輸出所有最后一個字段大于4的行
這個例子用$NF引用最后一個字段,如果它的數(shù)值大于4,那么就輸出。 |
|
|