關於awk多文件處理

關於awk的多文件處理
########################
awk的數據輸入有兩個來源,標準輸入和文件,後一種方式支持多個文件。
如:
1. shell的Pathname Expansion方式:
awk '{...}'  *.txt
#  *.txt先被shell解釋,替換成當前目錄下的所有*.txt
2. 直接指定多個文件:
awk '{...}' a.txt b.txt c.txt ...
# awk對多文件的處理流程是,依次讀取各個文件內容,如上例,先讀a.txt,再讀b.txt....

在多文件處理的時候,如何對不同文件做不同的操作呢?
########################
#     處理 2 個文件
########################
當awk讀取的文件只有兩個的時候,比較常用的有兩種方法:
(1) 一種是
awk 'NR==FNR{...}NR>FNR{...}'  file1 file2

awk 'NR==FNR{...}NR!=FNR{...}' file1 file2
(2) 另一種是 awk 'NR==FNR{...;next}{...}' file1 file2

FNR和NR這兩個awk內置變量的意義
FNR     The input record number in the current input file.  #已讀入當前文件的記錄數
NR      The total number of input records seen so far.      #已讀入的總記錄數
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.
  
awk 'NR==FNR{...}NR>FNR{...}' file1 file2
# 讀入file1的時候,已讀入file1的記錄數FNR一定等於awk已讀入的總記錄數NR,因爲file1是awk讀入的首個文件,故讀入file1時執行前一個命令塊{...}
# 讀入file2的時候,已讀入的總記錄數NR一定>讀入file2的記錄數FNR,故讀入file2時執行後一個命令塊{...}

awk 'NR==FNR{...;next}{...}' file1 file2
# 讀入file1時,滿足NR==FNR,先執行前一個命令塊,但因爲其中有next命令,故後一個命令塊{...}是不會執行的
# 讀入file2時,不滿足NR==FNR,前一個命令塊{..}不會執行,只執行後一個命令塊{...}
 
########################
#     處理 多個 文件
########################
當awk處理的文件超過兩個時,顯然上面那種方法就不適用了。因爲讀第3個文件或以上時,也滿足NR>FNR (NR!=FNR),顯然無法區分開來,所以就要用到更通用的方法了:
1. ARGIND        # 當前被處理參數標誌
awk 'ARGIND==1{...}ARGIND==2{...}ARGIND==3{...}... ' file1 file2 file3 ...複製代碼
2. ARGV            # 命令行參數數組
awk 'FILENAME==ARGV[1]{...}FILENAME==ARGV[2]{...}FILENAME==ARGV[3]{...}...' file1 file2 file3 ...複製代碼
3. 把文件名直接加入判斷
awk 'FILENAME=="file1"{...}FILENAME=="file2"{...}FILENAME=="file3"{...}...' file1 file2 file3 ...複製代碼
 
############
案例1處理兩個文件
############
# cat a
1:adf
2:adf
3:fds
4:vds
5:ldv
# cat b
a asd
b dfs
c sfd
d asd
e ldk
用b文件的第一個字段將a文件的第二個字段替換掉
# awk 'BEGIN{FS="[: ]+";OFS=":"}NR==FNR{a[k]=$1;k++;next}{print $1,a[i];i++}' b a
1:a
2:b
3:c
4:d
5:e
 
#########
案例2處理三個文件
#########
再加一文件c
# cat cone a234
two afd
three adsf
four adsf
five bsdf
將a,b,c三個文件的第一個字段提取出來,生成一個新文件
# awk 'BEGIN{FS="[: ]+";OFS=":"}ARGIND==1{a[i]=$1;i++;next}ARGIND==2{b[k]=$1;k++;next}{print a[v],b[n],$1;v++;n++}' a b c
1:a:one
2:b:two
3:c:three
4:d:four
5:e:five
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章