文本处理利器Linux Awk这样入门☛常见变量的使用
? ? ? ? ? ? ? ? ? ? ? ? ? ? Linux awk常見變量初識案例
聲明與簡介
簡介
AWK?是一種處理文本文件的語言,是一個強大的文本分析工具。awk通常用來處理結(jié)構(gòu)化(固定格式)的文本文件, awk每接收文件的一行,然后執(zhí)行相應的命令來處理文本。
本文是對awk的初步認識,主要結(jié)合數(shù)據(jù)以案例形式介紹內(nèi)置變量的使用。
數(shù)據(jù)說明
員工表全量
1 emp.txt如下是使用的示例文本(emp.txt)數(shù)據(jù),這里的行號是為了方便解釋結(jié)果,不是文本內(nèi)容。
1 7369,smith,clerk,7902,'1980-12-17',800,null,20 2 7499,allen,salesman,7698,'1981-2-20',1600,300,30 3 7521,ward,salesman,7698,'1981-2-22',1250,500,30 4 7566,jones,manager,7839,'1981-4-2',2975,null,20 5 7654,martin,salesman,7698,'1981-9-28',1250,1400,30 6 7655,jack,manager,7698,'1987-3-28',1600,1800,10 7 7656,tim,clerk,7902,'1982-12-12',1400,1400,30 8 7657,kate,clerk,7902,'1989-11-11',1400,1800,10 9 7698,blake,manager,7839,'1981-5-1',2850,null,30 10 7699,dlake,salesman,7839,'1983-6-15',3000,null,10 11 7782,clark,manager,7839,'1981-1-9',2450,null,10 12 7788,scott,analyst,7566,'1982-12-9,3000,null,20,scott 13 7839,king,president,null,'1981-11-17',5000,null,10 14 7844,turner,salesman,7698,'1981-12-8',1500,0,30 15 7876,adams,clerk,7788,'1983-1-12',1100,null,20 16 7900,james,clerk,7698,'1981-12-3',950,null,30 17 7902,ford,analyst,7566,'1981-12-3',3000,null,20 18 7934,miller,clerk,7782,'1982-1-23',1300,null,10部分員工表多分隔符
2 emp_plus.txt ,emp.txt的前三條記錄
1 7369:smith@clerk#7902$'1980-12-17' 2 7499:allen@salesman#7698$'1981-2-20' 3 7521:ward@salesman#7698$'1981-2-22'多行非換行分割
3?emp_mutiple.txt 里列分隔符是換行,但記錄分隔符是“#”
7369 smith clerk 7902 1980-12-17 # 7499 allen salesman 7698 1981-2-20員工表3條記錄?
4 emp_3_only.txt 員工表的前3條記錄
員工表4條記錄?
5 emp_4_only.txt 員工表的前4條記錄
7369,smith,clerk,7902,'1980-12-17',800,null,20 7499,allen,salesman,7698,'1981-2-20',1600,300,30 7521,ward,salesman,7698,'1981-2-22',1250,500,30 7900,james,clerk,7698,'1981-12-3',950,null,30常見命令
打印命令
打印命令print即將文本的內(nèi)容打印出來。
打印文本所有內(nèi)容
# 打印出所有的員工的信息。 awk {print} emp.txt # sed等價于 sed -n 'p' emp.txt # 結(jié)果(略),這里即數(shù)據(jù)文件的全部內(nèi)容。打印文本部分列?
# 打印出所有的員工員工號。此時顯示的不是第一列的內(nèi)容,原因是awk默認以空格作為列的分割符。而當前文件里是以逗號作為分隔符。 awk {print $1} emp.txt # 正確的寫法 awk -F',' '{print $1}' emp.txt # 結(jié)果(部分) 7369 7499 7521 7566#注:特別的 $0代表的是整個文本的記錄打印文本最后一列?
# 打印最后一列所有員工的部門編號,這里借助下文介紹的NR變量(記錄行數(shù))。 awk -F',' '{print $NF}' emp.txt #結(jié)果(部分數(shù)據(jù)) 20 30 30打印文本最后三列?
#打印倒數(shù)第三列所有員工的部門編號,可以通過NF-2來實現(xiàn),即: awk -F',' '{print $(NF-2)}' emp.txt #結(jié)果(部分數(shù)據(jù)) 800 1600 1250 2975?模式匹配
模式匹配命令即是通過//來匹配關(guān)鍵字,也支持正則表達式。
匹配關(guān)鍵字
# 找出職位是manager的員工號和到崗日期。 awk -F',' '/manager/{print $1,$5}' emp.txt # 結(jié)果 7566 '1981-4-2' 7655 '1987-3-28' 7698 '1981-5-1' 7782 '1981-1-9'正則匹配
# 找出員工號以78開頭的員工信息 awk -F',' '/^78/{print $0}' emp.txt 7839,king,president,null,'1981-11-17',5000,null,10 7844,turner,salesman,7698,'1981-12-8',1500,0,30 7876,adams,clerk,7788,'1983-1-12',1100,null,20 # 找出部門號是30的員工信息 awk -F',' '/30$/{print $0}' emp.txt # 結(jié)果(部分數(shù)據(jù)) 7499,allen,salesman,7698,'1981-2-20',1600,300,30 7521,ward,salesman,7698,'1981-2-22',1250,500,30 7654,martin,salesman,7698,'1981-9-28',1250,1400,30內(nèi)置變量
即awk內(nèi)置的系統(tǒng)變量,如FS、OFS、NR、RS、ORS等變量。
輸入列分隔符
FS((Field Separator))變量可以指定輸入字段的分隔符,即讀取文件時列的分割符號。
指定單個字段分隔符
# 指定文件的分隔符為逗號,這里通過FS變量的方式。 awk '{FS=","} {print $1,$2}' emp.txt # 結(jié)果,即第1、2列全部數(shù)據(jù)。這里略。?指定多個字段分隔符
# 如果原始文件各個列指定的分隔符不一致,則需要自己設定。 awk 'BEGIN {FS="[:@#$]"} {print $1,$2,$3,$4}' emp_plus.txt #結(jié)果 7369 smith clerk 7902 7499 allen salesman 7698 7521 ward salesman 7698 # 如果不加BEGIN,則從第2行開始應用awk邏輯 awk '{FS="[:@#$]"} {print $1,$2,$3,$4}' emp_plus.txt #結(jié)果為,第1行未應用awk邏輯。 7369:smith@clerk#7902$'1980-12-17' 7499 allen salesman 7698 7521 ward salesman 7698 #注:這里需要特別強調(diào),針對字段分隔符在大括號即“{}”執(zhí)行時,如果在大括號前不加begin則從第2行開始匹配,第1行打印的是原始數(shù)據(jù)。如果加了則從第一行開始適配(應用awk邏輯)。#延展閱讀,關(guān)于單獨使用BEGIN,注意這里得大寫。 # BEGIN可以不和END一起使用,即單獨使用。其中一個應用場景是,AWK后面沒有跟要處理的文件。比如 # 打印出字符串Nothing awk 'BEGIN {print "Nothing"}' # 如下不加BEGIN是用戶用戶干預(按下Enter即回車)才有輸入,且會一直執(zhí)行。 awk '{print "Nothing"}'輸出字段分隔符
OFS(Output Field Separator)變量可以指定輸入字段的分隔符 即讀輸出時列的分割符號。
指定字段分隔符
# Way1 打印第1、2列并以#作為分割符。 awk -F',' '{print $1,"#", $2}' emp.txt #結(jié)果,部分數(shù)據(jù) 7369 # smith 7499 # allen 7521 # ward # Way2 打印第1、2列并以#作為分割符。這里使用OFS參數(shù)即Output Field Separator。 awk -F',' 'BEGIN {OFS="#"} {print $1,$2}' emp.txt #結(jié)果,部分數(shù)據(jù) 7369#smith 7499#allen 7521#ward #注: 1 這里way1和way2的結(jié)果是不一樣的。Way1里有空格,而Way2則沒有空格。 # 2 輸出列分隔符時不能指定多個特定的分隔符,只能是一個固定的符號。輸入記錄分割符
RS(Record Separator)變量可以指定文本輸入的記錄分隔符,即讀取文件里每一行的分割符號。我們知道一般在windows里行分隔符是回車、換行(CR 、LF)對應ASSII碼分別是13、10,符號對應\r、\n。
非換行符的記錄分割
#通過cat查看文件里的隱藏字符 cat -A awk_rs.txt # 結(jié)果,注意這里的制表符是以^I的形式展示,行的結(jié)尾是$。 7369,smith,clerk,7902,'1980-12-17',800,null,20^I7499,allen,salesman,7698,'1981-2-20',1600,300,30^I7521,ward,salesman,7698,'1981-2-22',1250,500,30$ # Notepad++ 方式查看 # 對awk_rs.txt的文本進行記錄的分割(\t),列間的分隔符仍是逗號。 awk -F',' 'BEGIN {RS="\t"} {print $1,$2,$3}' awk_rs.txt #結(jié)果 7369 smith clerk 7499 allen salesman 7521 ward salesman換行符為列分隔符的分割
# 針對換行符為列分隔符,指定字符如#為記錄分割符的情況,對記錄按照列進行拆分(打印)。 awk -F'\n' 'BEGIN {RS="#\n"} {print $1,$2,$3}' emp_mutiple.txt #結(jié)果 7369 smith clerk 7499 allen salesman輸出記錄分割符
ORS(Output Record Separator)變量可以指定文本輸出的記錄分隔符,即經(jīng)過awk處理后輸出來的記錄分隔符。
非換行符的記錄分割
#解析emp.txt并輸出時以換行#換行(\n#\n)為輸出記錄分隔符。 awk -F',' 'BEGIN {RS="\n";ORS="\n#\n"} {print $1,$2,$3}' employee.txt #結(jié)果,部分數(shù)據(jù) 7369 smith clerk # 7499 allen salesman # 7521 ward salesman #打印行號
NR(number of record)是文本的行號,即文本的Line Number(行序號),這里行是以執(zhí)行的記錄分隔符,不一定都是換行符(\n)。
打印文本序號
# 打印所有員工的所在行號和雇員編號。 awk -F',' '{print NR,$1}' emp.txt #結(jié)果(部分數(shù)據(jù)) 1 7369 2 7499 3 7521文件名
FILENAME變量主要返回當前處理文件的文件名,用于多文件處理的情景。
打印文件名
# 打印當前處理的文件的名字,結(jié)果和該文件的行數(shù)一樣。 awk '{print FILENAME}' emp_plus.txt # 結(jié)果 emp_plus.txt emp_plus.txt emp_plus.txt多文件記錄行數(shù)
FNR(File Number Of records)記錄數(shù),即多文件文本的總行數(shù),這里行是以執(zhí)行的記錄分隔符,不一定都是換行符(\n)。
分開統(tǒng)計多文件行號
#通過多文件記錄FRS變量來分別統(tǒng)計多文件的行號和列信息。 awk 'BEGIN{FS=","} \ > {print FILENAME "記錄數(shù):",FNR,$1;} \ > END {print "總記錄數(shù):",NR}' \ > emp_3_only.txt emp_4_only.txt# 結(jié)果 emp_3_only.txt記錄數(shù): 1 7369 emp_3_only.txt記錄數(shù): 2 7499 emp_3_only.txt記錄數(shù): 3 7521 emp_3_only2.txt記錄數(shù): 1 7369 emp_3_only2.txt記錄數(shù): 2 7499 emp_3_only2.txt記錄數(shù): 3 7521 emp_3_only2.txt記錄數(shù): 4 7900 總記錄數(shù): 7# 注:1 這里awk腳本換行輸入時需要加上空格\。整體統(tǒng)計多文件行號
#通過單文件記錄RS遍歷來整體統(tǒng)計多文件的行號和列信息。 awk 'BEGIN{FS=","} \ > {print FILENAME "記錄數(shù):",NR,$1;} \ > END {print "總記錄數(shù):",NR}' \ > emp_3_only.txt emp_4_only.txt #結(jié)果 emp_3_only.txt記錄數(shù): 1 7369 emp_3_only.txt記錄數(shù): 2 7499 emp_3_only.txt記錄數(shù): 3 7521 emp_4_only.txt記錄數(shù): 4 7369 emp_4_only.txt記錄數(shù): 5 7499 emp_4_only.txt記錄數(shù): 6 7521 emp_4_only.txt記錄數(shù): 7 7900 總記錄數(shù): 7問題
有問題,請在評論區(qū)留言。
總結(jié)
以上是生活随笔為你收集整理的文本处理利器Linux Awk这样入门☛常见变量的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 62式坦克为什么比59式退役早?
- 下一篇: 15式主战坦克为什么能碾压T-72