【二】實踐中學習 awk

這些 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:已經讀出的記錄數,行號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章