精通awk系列 8 awk劃分欄位的3種方式

2021-09-29 21:50:35 字數 3093 閱讀 2655

回到:

紅塵**

awk讀取每一條記錄之後,會將其賦值給$0,同時還會對這條記錄按照預定義變數fs劃分字段,將劃分好的各個字段分別賦值給$1 $2 $3 $4...$n,同時將劃分的字段數量賦值給預定義變數nf

$n引用字段:

可使用變數或計算的方式指定要獲取的字段序號。

awk '' a.txt

awk '' a.txt # 括號必不可少,用於改變優先順序

awk '' a.txt

讀取record之後,將使用預定義變數fs、fieldwidths或fpat中的一種來分割字段。分割完成之後,再進入main**段(所以,在main中設定fs對本次已經讀取的record是沒有影響的,但會影響下次讀取)。

fs或者-f:字段分隔符

# 字段分隔符指定為單個字元

awk -f":" '' /etc/passwd

awk 'begin' /etc/passwd

# 字段分隔符指定為正規表示式

awk 'begin' a.txt

指定預定義變數fieldwidths按字元寬度分割字段,這是gawk提供的高階功能。在處理某欄位缺失時非常好用。

用法:

示例1:

# 沒取完的字串ddd被丟棄,且nf=3

$ awk 'begin' <<

aa bbb cc

# 字串不夠長度時無視

$ awk 'begin' <<

aa bbb cc dddd-

# *號取剩餘所有,nf=3

$ awk 'begin' <<

aa bbb ccdddd

# 字段數多了,則取完字串即可,nf=2

$ awk 'begin' <<

aa bbbccdddd 2

示例2:處理某些字段缺失的資料。

如果按照常規的fs進行字段分割,則對於缺失欄位的行和沒有缺失欄位的行很難統一處理,但使用fieldwidths則非常方便。

假設a.txt文字內容如下:

id  name    gender  age  email          phone

1 bob male 28 [email protected] 18023394012

2 alice female 24 [email protected] 18084925203

3 tony male 21 [email protected] 17048792503

4 kevin male 21 [email protected] 17023929033

5 alex male 18 18185904230

6 andy female 22 [email protected] 18923902352

7 jerry female 25 [email protected] 18785234906

8 peter male 20 [email protected] 17729348758

9 steven female 23 [email protected] 15947893212

10 bruce female 27 [email protected] 13942943905

因為email欄位有的是空欄位,所以直接用fs劃分字段不便處理。可使用fieldwidths。

# 欄位1:4字元

# 欄位2:8字元

# 欄位3:8字元

# 欄位4:2字元

# 欄位5:先跳過3字元,再讀13字元,該欄位13字元

# 欄位6:先跳過2字元,再讀11字元,該欄位11字元

awk '

begin

nr>1' a.txt

# 如果email為空,則輸出它

awk '

begin

nr>1

}' a.txt

fs是指定字段分隔符,來取得除分隔符外的部分作為字段。

fpat是取得匹配的字元部分作為字段。它是gawk提供的乙個高階功能。

fpat根據指定的正則來全域性匹配record,然後將所有匹配成功的部分組成$1、$2...,不會修改$0

fpat常用於字段中包含了字段分隔符的場景。例如,csv檔案中的一行資料如下:

robbins,arnold,"1234 a pretty street, ne",mytown,mystate,12345-6789,usa
其中逗號分隔每個字段,但雙引號包圍的是乙個字段整體,即使其中有逗號。

這時使用fpat來劃分各字段比使用fs要方便的多。

echo 'robbins,arnold,"1234 a pretty street, ne",mytown,mystate,12345-6789,usa' |\

awk '

begin}'

最後,patsplit()函式和fpat的功能一樣。

有fs、fieldwidths、fpat三種獲取欄位的方式,可使用procinfo陣列來確定本次使用何種方式獲得字段。

procinfo是乙個陣列,記錄了awk程序工作時的狀態資訊。

如果:例如:

if(procinfo["fs"]=="fs") else if(procinfo["fpat"]=="fpat") else if(procinfo["fieldwidths"]=="fieldwidths")

精通awk系列 8 awk劃分欄位的3種方式

回到 系統 awk讀取每一條記錄之後,會將其賦值給 0,同時還會對這條記錄按照預定義變數fs劃分字段,將劃分好的各個字段分別賦值給 1 2 3 4.n,同時將劃分的字段數量賦值給預定義變數nf。n引用字段 可使用變數或計算的方式指定要獲取的字段序號。awk a.txt awk a.txt 括號必不可...

awk 系列 如何使用 awk 內建變數

我們將逐漸揭開 awk 功能的神秘面紗,在本節中,我們將介紹 awk 內建built in變數的概念。你可以在 awk 中使用兩種型別的變數,它們是 使用者自定義user defined變數 我們在第八節中已經介紹了 和內建變數。awk 內建變數示例 awk 內建變數已經有預先定義的值了,但我們也可...

awk 從入門到精通

1 簡介 主要用來處理文字資料,處理效率高於shell,簡潔高效,絕對不會遇到記憶體溢位 2 命令處理模式 按行處理,一行一行執行 和shell一樣 3 命令格式 awk f f v begin end file f指定分隔符 f呼叫指令碼 v定義變數 var value 引用 塊 單引號 begi...