2021-05-12 14:32:11
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.
print "hello',"there","jim"
// 輸出為 hello there jim,這裡的逗號僅告訴awk:"helo" "there" "jim"是三個單獨的欄位,輸出欄位之間的分隔符仍是預設的OFS-空格.
要使用逗號來區分輸出的欄位,如下:
BEGIN {
FS="n"
RS=""
OFS="," // 將輸出欄位分隔符設定為逗號
}
輸出記錄分隔符(ORS),預設為換行(n),也可自定義。
BEGIN {
FS="n"
RS=""
OFS=","
ORS="nn" // 輸出間隔翻倍
}
將多行記錄換成一行內使用TAB分段格式
a.md內容如下,一條記錄占三行,記錄之間用空白行區分,一個欄位佔一行。
- huanxgin
XIAN
711711
CC
HANGZHOU
399229
MM
Shanghai
888912
要求:將一條記錄整理為一行,個欄位之間用tab分隔,以便匯入excel處理:
[root@web1 awk]# awk 'BEGIN{FS="n";RS="";OFS="t"} {print $1,$2,$3}' a.md
huanxgin XIAN 711711 // 輸出分隔符指定為製表符
CC HANGZHOU 399229
MM Shanghai888912
[root@web1 awk]# awk 'BEGIN{FS="n";RS="";ORS=""} { x=1; while(x<NF) { print $x "t" ;x++} print $NF "n"}' a.md //每個欄位來一個製表符,三個欄位後來一個換行。
huanxgin XIAN 711711
CC HANGZHOU 399229
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.
print "hello',"there","jim"
// 輸出為 hello there jim,這裡的逗號僅告訴awk:"helo" "there" "jim"是三個單獨的欄位,輸出欄位之間的分隔符仍是預設的OFS-空格.
要使用逗號來區分輸出的欄位,如下:
BEGIN {
FS="n"
RS=""
OFS="," // 將輸出欄位分隔符設定為逗號
}
輸出記錄分隔符(ORS),預設為換行(n),也可自定義。
BEGIN {
FS="n"
RS=""
OFS=","
ORS="nn" // 輸出間隔翻倍
}
將多行記錄換成一行內使用TAB分段格式
a.md內容如下,一條記錄占三行,記錄之間用空白行區分,一個欄位佔一行。
- huanxgin
XIAN
711711
CC
HANGZHOU
399229
MM
Shanghai
888912
要求:將一條記錄整理為一行,個欄位之間用tab分隔,以便匯入excel處理:
[root@web1 awk]# awk 'BEGIN{FS="n";RS="";OFS="t"} {print $1,$2,$3}' a.md
huanxgin XIAN 711711 // 輸出分隔符指定為製表符
CC HANGZHOU 399229
MM Shanghai888912
[root@web1 awk]# awk 'BEGIN{FS="n";RS="";ORS=""} { x=1; while(x<NF) { print $x "t" ;x++} print $NF "n"}' a.md //每個欄位來一個製表符,三個欄位後來一個換行。
huanxgin XIAN 711711
CC HANGZHOU 399229
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
相關文章