這些 awk 的例子都是我在工作中遇到的,使用 awk 可以達到事半功倍的效果。大家也許可以參考一下。
1. 去掉每一行首尾空格,並編號
文件格式如下:
o ne
two
three
four
five
six
seven
eight
nine
ten
使用awk '{print "[",$0,"]"}' one.txt
查看,有的行還有空格:
[ o ne ]
[ two ]
[ three ]
[ four ]
[ five ]
[ six ]
[ seven ]
[ eight ]
[ nine ]
[ ten ]
對每一行編號並逗號拼接,且將空格、製表符去掉,如 「one」 變成 「1,one」。
# 首先將空格給替換了,
# ^[ \t]+ 匹配行首一個或多個空格
# [ \t]+$ 匹配行末一個或多個空格
# ^[ \t]+|[ \t]+$ 同時匹配行首或者行末的空格
awk '{gsub(/^[ \t]+|[ \t]+$/,"");print $0}' one.txt
# 使用內建變量 OFS 和 NR 打印逗號和行號
awk -v OFS=',' '{gsub(/^[ \t]+|[ \t]+$/,"");print NR,$0}' one.txt > one_re.txt
最後輸出結果:
2. 將文件中每一行的數字 id 使用逗號拼接,併合共成一行
文件內容格式如下:
124
432
3252
4634
654
76
3453
57546
3453
45645
34535
3463
3453
456345
# printf 類似於 C語言printf函數
awk '{printf "%s,",$1}' ids.txt
結果如下:
124,432,3252,4634,654,76,3453,57546,3453,45645,34535,3463,3453,456345,%
3. 比較兩個文件,找出兩個文件中的 diff 數據
文件 1:region_prod.txt 如下:
"北京",
"上海",
"重慶",
"天津",
"三沙",
"長沙",
"四川"
文件 2:region_test.txt 如下:
"上海",
"重慶",
"四川",
"北京",
"天津"
執行下面的 awk 代碼,如果 region_prod.txt 中的數據在 region_test.txt 中不存在,則會進行打印。
awk -F, 'NR==FNR{a[$1];next}!($1 in a)' region_test.txt region_prod.txt
輸出結果:
"三沙",
"長沙",
交換兩個文件的位置,反之亦然:
awk -F, 'NR==FNR{a[$1];next}!($1 in a)' region_prod.txt region_test.txt
具體的細節描述,可參考:awk之in的運用實例
如何使用 awk 的 ‘next’ 命令
4.匹配文件中數字的行,並打印出前10行出現數字的行號
文件格式:
dfdddgds,
1231,
-2352,
fgd,
dfgfd,
awk -F, '{if($1 ~ /^[ ]*-?[0-9]+$/) print NR}' main.log | head -n 10
-F,
:指定每行的列分隔符爲,
if($1 ~ /^[ ]*-?[0-9]+$/)
:判斷第一個記錄 $1
是否能和正則表達式匹配
~
:匹配操作符,用於對記錄或字段的表達式進行匹配
/^[ ]*-?[0-9]+$/
:匹配數字的行的正則表達式
NR
:已經讀出的記錄數,行號