[Linux][Shell Script] awk, sed筆記 (文字資料處理)

最近比較常用到shell script處理資料,
每用到一次指令都要重新查,太浪費時間了~
在這邊筆記下來常用的指令,不定時更新
---------------------------------------------------

awk

 垂直數字加總

說明:將n欄位的數字加總,最後印出來

範例檔案內容 (num.txt):加總欄位1的數字
1 a
2 b
3 c

指令: cat num.txt | awk '{sum += $1} END {print sum}'
輸出:6


○ 列印指定欄位 (空白間隔)


指令: cat num.txt | awk '{print $2}'
輸出
a
b
c      


○ 列印指定欄位 (自訂間隔符號)


範例檔案內容 (num.txt):
1,a
2,b
3,c

指令: cat num.txt | awk 'BEGIN {FS="."}; {print $2}'
輸出

a
b
c

說明:awk預設是以空白符號來做為欄位的切割。若要自行設定awk命令中的分隔符號,必須使用'FS'這個關鍵字來指定。例如FS=",",表示將","符號當成欄位分隔。但因為FS的設定必須在awk指令執行之前就要設定,所以必須再加上BEGIN這個關鍵字才行。另外awk命令間要使用分號";"。

---------------------------------------------------

sed


○ 取代指令


sed 's/[target]/[replace]/g'
說明:第一個/的左邊是s表示替換,g表示替換原來buffer中的文字
sed在處理字符串的時候並不對源文件進行直接處理,先創建一個buffer,但是加g表示對原buffer進行替換

○ 範圍刪除


範例檔案 test.txt
a
b
c
d
e
f
g

1) 刪除 b ~ f
sed -e '/b/,/f/d' test.txt
輸出:
a
g

2) 刪除 b ~ f,但不包括 f
sed -e '/b/,/f/{/f/!d}' test.txt
輸出:
a
f
g

3) 刪除 b ~ f,但不包括 b 與 f
sed -e '/b/,/f/{/[b,f]/!d}' test.txt
輸出:
a
b
f
g

 取代行首行末空格

1) 行首空格
sed 's/^[ \t]*//g' 

說明:
a. ^是表示以後面的xx開頭。
b. 中括號表示"OR",所以[ \t]是空格或tab中的任意一種。
c. *,表示零個到多個。
d. 第二個和第三個/中間沒有東西,表示空字串。
整體的意思是:用空字符去替換零個到多個用空格或tab開頭的字

2) 行末空格
sed 's/[ \t]*$//g' 

說明:美元符號$表示以xx結尾的字符串為對象。
整體的意思是:用空字符去替換零個到多個用空格或tab結尾的字

留言