首頁 > 軟體

awk-語法深入-記錄、欄位分隔符

2020-06-16 17:23:48

  awk規定,對於文字檔案,預設情況下,一條記錄對應一行,即記錄之間的預設分隔符是換行符;而一條記錄又可以分為多個欄位,預設欄位分隔符為空格。

   輸入記錄分隔符變數:RS(record sign)
   輸出記錄分隔符變數:ORS(output record sign)
   欄位分隔符變數:FS(field sign)
   輸出欄位分隔符變數:OFS(output field sign)
1.一條記錄占多行(多行記錄)
  有些情況下:一條記錄跨越多行,記錄與記錄之間使用非換行符。這種情況下需要修改記錄分隔符變數RS,RS告訴awk當前記錄什麼時候結束。
  例如:
     BEGIN {
        FS="n"  // 將欄位分隔符設為換行符,一個欄位佔一行
        RS=""    // 將記錄分隔符設為空白行,記錄之間由空白行分隔
     }
 
2.OFS 和 ORS
 輸出欄位分隔符(OFS),預設為單個空格" ",可以修改OFS變數,制定輸出欄位之間的分隔符。
 eg.
  1.  print "hello',"there","jim"
  // 輸出為 hello there jim,這裡的逗號僅告訴awk:"helo" "there" "jim"是三個單獨的欄位,輸出欄位之間的分隔符仍是預設的OFS-空格.
要使用逗號來區分輸出的欄位,如下:
  1.  BEGIN {
  2.     FS="n"
  3.     RS=""
  4.     OFS="," // 將輸出欄位分隔符設定為逗號
  5.  } 
 
 輸出記錄分隔符(ORS),預設為換行(n),也可自定義。
  1. BEGIN {
  2.     FS="n"
  3.     RS=""
  4.     OFS=","
  5.     ORS="nn"  // 輸出間隔翻倍 
  6. }
 
 將多行記錄換成一行內使用TAB分段格式
 
 a.md內容如下,一條記錄占三行,記錄之間用空白行區分,一個欄位佔一行。
  1. huanxgin
  2. XIAN
  3. 711711
  4. CC
  5. HANGZHOU
  6. 399229
  7. MM
  8. Shanghai
  9. 888912
要求:將一條記錄整理為一行,個欄位之間用tab分隔,以便匯入excel處理:
  1. [root@web1 awk]# awk 'BEGIN{FS="n";RS="";OFS="t"} {print $1,$2,$3}' a.md
  2. huanxgin XIAN 711711 // 輸出分隔符指定為製表符
  3. CC HANGZHOU 399229
  4. MM Shanghai888912
  5. [root@web1 awk]# awk 'BEGIN{FS="n";RS="";ORS=""} { x=1; while(x<NF) { print $x "t" ;x++} print $NF "n"}' a.md //每個欄位來一個製表符,三個欄位後來一個換行。
  6. huanxgin XIAN 711711
  7. CC HANGZHOU 399229
  8. MM Shanghai888912
 
總結: awk 命令與shell相同,一條命令占一行的情況下不需要分號來進行區分,多條命令在同一行時,需要分號來區分。
while 、if、for語句也保持一致. 
 
NF、NR 常用來計算待處理檔案的行數,參照最後一個欄位($NF)。
  awk規定,對於文字檔案,預設情況下,一條記錄對應一行,即記錄之間的預設分隔符是換行符;而一條記錄又可以分為多個欄位,預設欄位分隔符為空格。
   輸入記錄分隔符變數:RS(record sign)
   輸出記錄分隔符變數:ORS(output record sign)
   欄位分隔符變數:FS(field sign)
   輸出欄位分隔符變數:OFS(output field sign)
1.一條記錄占多行(多行記錄)
  有些情況下:一條記錄跨越多行,記錄與記錄之間使用非換行符。這種情況下需要修改記錄分隔符變數RS,RS告訴awk當前記錄什麼時候結束。
  例如:
     BEGIN {
        FS="n"  // 將欄位分隔符設為換行符,一個欄位佔一行
        RS=""    // 將記???分隔符設為空白行,記錄之間由空白行分隔
     }
 
2.OFS 和 ORS
 輸出欄位分隔符(OFS),預設為單個空格" ",可以修改OFS變數,制定輸出欄位之間的分隔符。
 eg.
  1.  print "hello',"there","jim"
  // 輸出為 hello there jim,這裡的逗號僅告訴awk:"helo" "there" "jim"是三個單獨的欄位,輸出欄位之間的分隔符仍是預設的OFS-空格.
要使用逗號來區分輸出的欄位,如下:
  1.  BEGIN {
  2.     FS="n"
  3.     RS=""
  4.     OFS="," // 將輸出欄位分隔符設定為逗號
  5.  } 
 
 輸出記錄分隔符(ORS),預設為換行(n),也可自定義。
  1. BEGIN {
  2.     FS="n"
  3.     RS=""
  4.     OFS=","
  5.     ORS="nn"  // 輸出間隔翻倍 
  6. }
 
 將多行記錄換成一行內使用TAB分段格式
 
 a.md內容如下,一條記錄占三行,記錄之間用空白行區分,一個欄位佔一行。
  1. huanxgin
  2. XIAN
  3. 711711
  4. CC
  5. HANGZHOU
  6. 399229
  7. MM
  8. Shanghai
  9. 888912
要求:將一條記錄整理為一行,個欄位之間用tab分隔,以便匯入excel處理:
  1. [root@web1 awk]# awk 'BEGIN{FS="n";RS="";OFS="t"} {print $1,$2,$3}' a.md
  2. huanxgin XIAN 711711 // 輸出分隔符指定為製表符
  3. CC HANGZHOU 399229
  4. MM Shanghai888912
  5. [root@web1 awk]# awk 'BEGIN{FS="n";RS="";ORS=""} { x=1; while(x<NF) { print $x "t" ;x++} print $NF "n"}' a.md //每個欄位來一個製表符,三個欄位後來一個換行。
  6. huanxgin XIAN 711711
  7. CC HANGZHOU 399229
  8. MM Shanghai888912
 
總結: awk 命令與shell相同,一條命令占一行的情況下不需要分號來進行區分,多條命令在同一行時,需要分號來區分。
while 、if、for語句也保持一致. 
NF、NR 常用來計算待處理檔案的行數,參照最後一個欄位($NF)。

Linux常用命令之awk http://www.linuxidc.com/Linux/2016-09/135046.htm

Linux系統之文字格式化工具awk http://www.linuxidc.com/Linux/2016-02/128150.htm

AWK簡介及使用範例 http://www.linuxidc.com/Linux/2013-12/93519.htm

Linux awk文字分析工具 http://www.linuxidc.com/Linux/2015-12/126217.htm

Linux文字處理工具之awk  http://www.linuxidc.com/Linux/2015-01/111437.htm

如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm

文字分析工具-awk  http://www.linuxidc.com/Linux/2014-12/110939.htm

AWK入門基礎教學  http://www.linuxidc.com/Linux/2016-12/138138.htm

使用awk格式化輸出文字 http://www.linuxidc.com/Linux/2016-04/130193.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-01/139371.htm


IT145.com E-mail:sddin#qq.com