AWK 使用總結(jié)

原文地址

awk 是處理文本的工具,Mac 自帶這個程序。

適合文本比較復(fù)雜的格式化數(shù)據(jù)。

基本語法

awk [可選參數(shù)] [模式-動作] 文件名

awk 會一行一行的處理文件里面的內(nèi)容。

可選參數(shù)說明:
  • -F 指定分隔符, 默認(rèn)是以空格作為分隔符;
  • -f 從腳本文件中讀取 awk 命令;

可選參數(shù)可以省略。

模式-動作 說明:

其中模式可以有 0 個或者多個,每一行的內(nèi)容會依次測試每個模式,所有的模式都匹配之后,會執(zhí)行相應(yīng)的動作。

每個模式或者動作里面可以使用 awk 中的 運算符內(nèi)置變量, 內(nèi)置函數(shù)等。

假設(shè)有一個 emp.data 文件, 里面內(nèi)容是部分 NBA 球員的姓名,身高, 年齡的數(shù)據(jù):

Stephen Curry, 1.91, 31
Kevin Durant, 2.06, 30
LeBron James, 2.03, 34
Russell Westbrook, 1.92, 30
Kyrie Lrving, 1.90, 27
  1. 沒有模式

輸出每一行的內(nèi)容, 使用如下命令:

awk '{print $0}' emp.data 

結(jié)果如下:

Stephen Curry, 1.91, 31
Kevin Durant, 2.06, 30
LeBron James, 2.03, 34
Russell Westbrook, 1.92, 30
Kyrie Lrving, 1.90, 27

輸出第一列的內(nèi)容, 使用如下命令:

awk '{print $1}' emp.data

結(jié)果如下:

Stephen
Kevin
LeBron
Russell
Kyrie

發(fā)現(xiàn)第一列的姓名沒有顯示完全, 因為 awk 默認(rèn)是以空格作為分隔符的,如果需要顯示完全需要我們顯示的指定分隔符。

輸出每個人的名字, 使用如下命令:

awk -F "," '{print $1}' emp.data

結(jié)果如下:

Stephen Curry
Kevin Durant
LeBron James
Russell Westbrook
Kyrie Lrving

輸出每個球員名字的小寫字母, 使用如下命令:

awk -F "," ' {print tolower($1)}' emp.data

結(jié)果如下:

stephen curry
kevin durant
lebron james
russell westbrook
kyrie lrving
  1. 單個模式

輸出年齡大于30歲的球員的姓名和身高, 使用如下命令:

awk -F "," '$3 > 30 {print $1, $2}' emp.data

結(jié)果如下:

Stephen Curry  1.91
LeBron James  2.03

輸出姓名大于12個字符(含空格)的球員信息, 使用如下命令:

awk -F "," 'length($1) > 12 {print $0}' emp.data

結(jié)果如下:

Stephen Curry, 1.91, 31
Russell Westbrook, 1.92, 30
  1. 多個模式

輸出年齡大于30歲,并且身高大于2米的球員的信息,使用如下命令:

awk -F "," '$3 > 30 &&  $2 > 2.00 {print $0}' emp.data

結(jié)果如下:

LeBron James, 2.03, 34

awk 腳本

語法結(jié)構(gòu)如下:

BEGIN {放置的是執(zhí)行前的語句}
{處理每一行時要執(zhí)行的語句}
END {處理完所有的行后要執(zhí)行的語句}

其中 BEGINEND 都是可選的。

統(tǒng)計所有球員的總身高,使用如下命令:

awk -F "," '{sum+=$2} END {print sum}' emp.data

其中 sum 為自定義的變量, $2 為內(nèi)置變量,表示第二列的值。

結(jié)果如下:

9.82

運算符

運算符 描述
= += -= *= /= %= ^= **= 賦值
?: C條件表達(dá)式
|| 邏輯或
&& 邏輯與
~ ~! 匹配正則表達(dá)式和不匹配正則表達(dá)式
< <= > >= != == 關(guān)系運算符
空格 連接
+ - 加,減
* / % 乘,除與求余
+ - ! 一元加,減和邏輯非
^ *** 求冪
++ -- 增加或減少,作為前綴或后綴
$ 字段引用
in 數(shù)組成員

變量

$ + 數(shù)字 表示某個字段: $1 表示第一個字段, $2 表示第二個字段, $3 表示第三個字段, … , $0 表示一整行。

變量 NF 表示當(dāng)前行有多少個字段。

變量 NR 表示當(dāng)前是第幾行。

其他常用變量:

  • FILENAME:當(dāng)前文件名
  • FS:字段分隔符,默認(rèn)是空格和制表符。
  • RS:行分隔符,用于分割每一行,默認(rèn)是換行符。
  • OFS:輸出字段的分隔符,用于打印時分隔字段,默認(rèn)為空格。
  • ORS:輸出記錄的分隔符,用于打印時分隔記錄,默認(rèn)為換行符。
  • OFMT:數(shù)字輸出的格式,默認(rèn)為%.6g。

函數(shù)

常用的函數(shù)如下:

  • tolower():字符轉(zhuǎn)為小寫。
  • toupper(): 字符串轉(zhuǎn)為大寫。
  • length():返回字符串長度。
  • substr():返回子字符串。
  • sin():正弦。
  • cos():余弦。
  • sqrt():平方根。
  • rand():隨機(jī)數(shù)。

awk 內(nèi)置函數(shù)的完整列表,可以查看手冊。

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載 原文的排版和內(nèi)容都更加友好,并且詳細(xì),我只是在這里貼出了一部分留作自己以后參考和學(xué)習(xí),如希望更詳細(xì)了解AWK...
    XKirk閱讀 3,372評論 2 25
  • awk介紹awk變量printf命令:實現(xiàn)格式化輸出操作符awk patternawk actionawk數(shù)組aw...
    哈嘍別樣閱讀 1,743評論 0 4
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,723評論 0 5
  • Linux指令中文說明傳送入口 整理自Linux指令中文說明 文本和數(shù)據(jù)進(jìn)行處理的編程語言awk 是一種編程語言,...
    釋閑人閱讀 2,389評論 1 6
  • awk:報告生成器,格式化文本輸出 內(nèi)容: awk介紹 awk基本用法 awk變量 awk格式化 awk操作符 a...
    BossHuang閱讀 1,557評論 0 9

友情鏈接更多精彩內(nèi)容