- 論壇徽章:
- 33
|
本帖最后由 Shell_HAT 于 2015-07-06 11:52 編輯
回復(fù) 35# tt_yy123
就是兩個(gè)普通的字符串,沒(méi)有什么特殊含義,你高興的話可以換成別的。
目的是讓你看清楚到底是哪個(gè){}里面的內(nèi)容在執(zhí)行。
關(guān)于awk的多文件處理:
awk的數(shù)據(jù)輸入有兩個(gè)來(lái)源,標(biāo)準(zhǔn)輸入和文件,后一種方式支持多個(gè)文件,如
1、shell的Pathname Expansion方式:awk '{...}' *.txt # *.txt先被shell解釋,替換成當(dāng)前目錄下的所有*.txt,如當(dāng)前目錄有1.txt和2.txt,則命令最終為awk '{...}' 1.txt 2.txt
2、直接指定多個(gè)文件: awk '{...}' a.txt b.txt c.txt ...
awk對(duì)多文件的處理流程是,依次讀取各個(gè)文件內(nèi)容,如上例,先讀a.txt,再讀b.txt....
那么,在多文件處理的時(shí)候,如何判斷awk目前讀的是哪個(gè)文件,而依次做對(duì)應(yīng)的操作呢?
1、當(dāng)awk讀取的文件只有兩個(gè)的時(shí)候,比較常用的有兩種方法
一種是awk 'NR==FNR{...}NR>FNR{...}' file1 file2 或awk 'NR==FNR{...}NR!=FNR{...}' file1 file2
另一種是 awk 'NR==FNR{...;next}{...}' file1 file2
了解了FNR和NR這兩個(gè)awk內(nèi)置變量的意義就很容易知道這兩種方法是如何運(yùn)作的
FNR The input record number in the current input file. #已讀入當(dāng)前文件的記錄數(shù)
NR The total number of input records seen so far. #已讀入的總記錄數(shù)
next Stop processing the current input record. The next input record is
read and processing starts over with the first pattern in the AWK
program. If the end of the input data is reached, the END block(s),
if any, are executed.
對(duì)于awk 'NR==FNR{...}NR>FNR{...}' file1 file2
讀入file1的時(shí)候,已讀入file1的記錄數(shù)FNR一定等于awk已讀入的總記錄數(shù)NR,因?yàn)閒ile1是awk讀入的首個(gè)文件,故讀入file1時(shí)執(zhí)行前一個(gè)命令塊{...}
讀入file2的時(shí)候,已讀入的總記錄數(shù)NR一定>讀入file2的記錄數(shù)FNR,故讀入file2時(shí)執(zhí)行后一個(gè)命令塊{...}
對(duì)于awk 'NR==FNR{...;next}{...}' file1 file2
讀入file1時(shí),滿足NR==FNR,先執(zhí)行前一個(gè)命令塊,但因?yàn)槠渲杏衝ext命令,故后一個(gè)命令塊{...}是不會(huì)執(zhí)行的
讀入file2時(shí),不滿足NR==FNR,前一個(gè)命令塊{..}不會(huì)執(zhí)行,只執(zhí)行后一個(gè)命令塊{...}
2、當(dāng)awk處理的文件超過(guò)兩個(gè)時(shí),顯然上面那種方法就不適用了。因?yàn)樽x第3個(gè)文件或以上時(shí),也滿足NR>FNR (NR!=FNR),顯然無(wú)法區(qū)分開(kāi)來(lái)。
所以就要用到更通用的方法了:
1、ARGIND 當(dāng)前被處理參數(shù)標(biāo)志: awk 'ARGIND==1{...}ARGIND==2{...}ARGIND==3{...}... ' file1 file2 file3 ...
2、ARGV 命令行參數(shù)數(shù)組: awk 'FILENAME==ARGV[1]{...}FILENAME==ARGV[2]{...}FILENAME==ARGV[3]{...}...' file1 file2 file3 ...
3、把文件名直接加入判斷: awk 'FILENAME=="file1"{...}FILENAME=="file2"{...}FILENAME=="file3"{...}...' file1 file2 file3 ...
#沒(méi)有前兩種通用 |
|