回覆列表
  • 1 # 喬家大院喬

    關於awk的多檔案處理:

    1、shell的Pathname Expansion方式:awk "{...}" *.txt # *.txt先被shell解釋,替換成當前目錄下的所有*.txt,如當前目錄有1.txt和 2.txt,則命令最終為awk "{...}" 1.txt 2.txt

    2、直接指定多個檔案: awk "{...}" a.txt b.txt c.txt ...

    awk對多檔案的處理流程是,依次讀取各個檔案內容,如上例,先讀a.txt,再讀b.txt....

    那麼,在多檔案處理的時候,如何判斷awk目前讀的是哪個檔案,而依次做對應的操作呢?

    1、當awk讀取的檔案只有兩個的時候,比較常用的有兩種方法

    一種是awk "NR==FNR{...}NR>FNR{...}" file1 file2 或awk "NR==FNR{...}NR!=FNR{...}" file1 file2

    另一種是 awk "NR==FNR{...;next}{...}" file1 file2

    瞭解了FNR和NR這兩個awk內建變數的意義就很容易知道這兩種方法是如何運作的

    QUOTE:

    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,前一個命令塊{..}不會執行,只執行後一個命令塊{...}

    2、當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 ... #沒有前兩種通用

  • 中秋節和大豐收的關聯?
  • 高中生讀什麼刊物好?