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

  1. 只把名字印出來
    $ awk ‘{print $1}’ file
    Name
    Deepak
    Neha
    Vijay
    Guru

  2. 把 header 拿掉
    $ awk 'NR!=1{print $1}' file
    Deepak
    Neha
    Vijay
    Guru

  3. 只印有 Deepak 的列
    $ awk '$0 ~ /Deepak/{print}' file
    Deepak Banking

  4. 印第一行不含 Deepak 的
    $ awk -F, '$1 !~ /Deepak/' file
    Name Domain
    Neha Telecom
    Vijay Finance
    Guru Migration

接著,如果有一個 file 長這個樣子
START
Unix
Linux
START
Solaris
Aix
SCO

  1. Join START 之後的列
    awk '/START/{if (NR!=1)print "";next}{printf $0}END{print "";}' file
    UnixLinux
    SolarisAixSCO

  2. 同 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

  1. 把第二行加總
    awk -F"," '{x+=$2}END{print x}' file
    3000

  2. 找 set($1)
    awk -F, '{a[$1];}END{for (i in a)print i;}' file
    Item1
    Item2
    Item3

  3. 把各 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

  4. 以第一行值為檔名.txt分開各檔案
    awk -F, '{print > $1".txt"}' file

如果接著有一個 file 長這個樣子

HEADER
Unix
Linux
Solaris
AIX
SCO
TRAILER

  1. 每四列分一個檔案
    awk 'NR%4==1{x="F"++i;}{print > x}' file

$ cat F1
HEADER
Unix
Linux
Solaris

$ cat F2
AIX
SCO
TRAILER

  1. 每三列分一個檔案,排除 HEADER 和 TRAILER
    sed '1d;$d;' file | awk 'NR%3==1{x="F"++i;}{print > x}'

cat F1
Unix
Linux
Solaris

$ cat F2
AIX
SCO

  1. 每三列分一個檔案,每一個檔案都要有 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

  1. 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

  1. 取出中括號裡的數
    awk -F '[][]' '{print $2}' file
    202
    203
    204

如果接著有一個 file 長這個樣子:
Unix,10,A
Linux,30,B
Solaris,40,C
Fedora,20,D
Ubuntu,50,E

  1. 在第一行插入列數
    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

  2. 把第一行變大寫
    awk -F, '{$1=toupper($1)}1' OFS=, file
    UNIX,10,A
    LINUX,30,B
    SOLARIS,40,C
    FEDORA,20,D
    UBUNTU,50,E

  3. 第一行只取前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








留言

熱門文章