awk
https://www.runoob.com/linux/linux-comm-awk.html
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
基本用法
log.txt文本内容如下:
2 this is a test 3 Are you like awk This's a test 10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
# 每行按空格或TAB分割,输出文本中的1、4项 $ awk '{print $1,$4}' log.txt --------------------------------------------- 2 a 3 like This's 10 orange,apple,mongo # 格式化输出 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt --------------------------------------------- 2 a 3 like This's 10 orange,apple,mongo
去前幾碼
awk '{print substr($0,33,14)}' ./cellids.tmp > cellids.now
/data/aaaa/bbbbgers/aa2.12/0015/aa2.120015.002 > aa2.120015.002
from https://noootown.com/awk-useful-usage/
首先,如果有一個 file 長這個樣子:Name Domain
Deepak Banking
Neha Telecom
Vijay Finance
Guru Migration
- 只把名字印出來
$ awk ‘{print $1}’ file
Name
Deepak
Neha
Vijay
Guru - 把 header 拿掉
$ awk 'NR!=1{print $1}' file
Deepak
Neha
Vijay
Guru 只印有 Deepak 的列
$ awk '$0 ~ /Deepak/{print}' file
Deepak Banking印第一行不含 Deepak 的
$ awk -F, '$1 !~ /Deepak/' file
Name Domain
Neha Telecom
Vijay Finance
Guru Migration
接著,如果有一個 file 長這個樣子START
Unix
Linux
START
Solaris
Aix
SCO
- Join START 之後的列
awk '/START/{if (NR!=1)print "";next}{printf $0}END{print "";}' file
UnixLinux
SolarisAixSCO 同 5 用逗號分開,事實上,上一篇就是用到這個用法
awk '/START/{if (x)print x;x="";next}{x=(!x)?$0:x","$0;}END{print x;}' file
Unix,Linux
Solaris,Aix,SCO
如果接著有一個 file 長這個樣子Item1,200
Item2,500
Item3,900
Item2,800
Item1,600
- 把第二行加總
awk -F"," '{x+=$2}END{print x}' file
3000 找 set($1)
awk -F, '{a[$1];}END{for (i in a)print i;}' file
Item1
Item2
Item3把各 item 的數值連接起來
awk -F, '{a[$1]=a[$1]?a[$1]":"$2:$2;}END{for (i in a)print i, a[i];}' OFS=, file
Item1,200:600
Item2,500:800
Item3,900以第一行值為檔名.txt分開各檔案
awk -F, '{print > $1".txt"}' file
如果接著有一個 file 長這個樣子
HEADER
Unix
Linux
Solaris
AIX
SCO
TRAILER
- 每四列分一個檔案
awk 'NR%4==1{x="F"++i;}{print > x}' file
$ cat F1
HEADER
Unix
Linux
Solaris
$ cat F2
AIX
SCO
TRAILER
- 每三列分一個檔案,排除 HEADER 和 TRAILER
sed '1d;$d;' file | awk 'NR%3==1{x="F"++i;}{print > x}'
cat F1
Unix
Linux
Solaris
$ cat F2
AIX
SCO
- 每三列分一個檔案,每一個檔案都要有 HEADER 和 TRAILER
awk 'BEGIN{getline f;}NR%3==2{x="F"++i;a[i]=x;print f>x;}{print > x}END{for(j=1;j<i;j++)print> a[j];}' file
$ cat F1
HEADER
Unix
Linux
Solaris
TRAILER
$ cat F2
HEADER
Aix
SCO
TRAILER
如果接著有一個 file 長這個樣子:Item1:2010:10;20;30
Item2:2012:12;29;19
Item3:2014:15;50;61
- ungroup 每一列
awk -F '[;:]' '{for(i=3;i<=5;i++){print $1,$2,$i;}}' OFS=":" file
Item1:2010:10
Item1:2010:20
Item1:2010:30
Item2:2012:12
Item2:2012:29
Item2:2012:19
Item3:2014:15
Item3:2014:50
Item3:2014:61
如果接著有一個 file 長這個樣子:123;abc[202];124
125;abc[203];124
127;abc[204];124
- 取出中括號裡的數
awk -F '[][]' '{print $2}' file
202
203
204
如果接著有一個 file 長這個樣子:Unix,10,A
Linux,30,B
Solaris,40,C
Fedora,20,D
Ubuntu,50,E
在第一行插入列數
awk -F, '{$1=++i FS $1;}1' OFS=, file
1,Unix,10,A
2,Linux,30,B
3,Solaris,40,C
4,Fedora,20,D
5,Ubuntu,50,E把第一行變大寫
awk -F, '{$1=toupper($1)}1' OFS=, file
UNIX,10,A
LINUX,30,B
SOLARIS,40,C
FEDORA,20,D
UBUNTU,50,E第一行只取前3個字
awk -F, '{$1=substr($1,0,3)}1' OFS=, file
Uni,10,A
Lin,30,B
Sol,40,C
Fed,20,D
Ubu,50,E
留言
張貼留言