歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> awk-語法深入-記錄、字段分隔符

awk-語法深入-記錄、字段分隔符

日期:2017/2/28 13:44:51   编辑:Linux教程

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="\n\n" // 輸出間隔翻倍
  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="\n\n" // 輸出間隔翻倍
  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

Copyright © Linux教程網 All Rights Reserved