Linux命令 awk案例

2024-01-26  本文已影响0人  bioschool点cn

使用的示例文件如下:

$ cat awk_case.txt 
a    a1    a2    a3
b    b1    b2    b3
c    c1    c2    c3

输出指定列:

$ awk '{print $1,$3}' awk_case.txt #输出第一列和第三列
a a2
b b2
c c2
$ awk '{printf "%-4s %-8s\n", $1,$3}' awk_case.txt #格式化输出
a    a2      
b    b2      
c    c2  

指定分隔符:

$ awk -F1 '{print $2}' awk_case.txt #指定分隔符为1
    a2    a3
    b2    b3
    c2    c3
$ awk 'BEGIN{FS="1"}{print $2}' awk_case.txt #使用内建变量FS,效果相同
    a2    a3
    b2    b3
    c2    c3

注:FS的优先级高于-F,即同时指定-F和FS时会使用FS参数

插入字段:

$ awk '{$2=$2"\t"$1"4";print $0}' awk_case.txt #在第二列的后面插入*4。
a a1    a4 a2 a3
b b1    b4 b2 b3
c c1    c4 c2 c3

解释:默认-F参数为空白或者Tab键,2表示第二列,1表示第一列;在'{}'中,空白表示连接符。通过=修改了第二列的值之后输出全行:print $0

去重复:

$ cat awk_case.txt 
a    a1    a2    a3
a    a4    a5    a6
b    b1    b2    b3
c    c1    c2    c3
$ awk '{ if (!arr[$1]++) {print} }' awk_case.txt #if 判断,根据第一列去重复
a    a1    a2    a3
b    b1    b2    b3
c    c1    c2    c3
$ awk '!arr[$1]++{print}' awk_case.txt #根据第一列去重复
a    a1    a2    a3
b    b1    b2    b3
c    c1    c2    c3

解释:arr为数组,通过下标记录arr中存储的值

统计次数:

$ awk '{arr[$1]++}END{OFS="\t";for(idx in arr){print arr[idx],idx}}' awk_case.txt 
2    a
1    b
1    c

统计第一列出现的次数;arr[$1]++循环文件,END最后执行一次,并使用for循环输出数组中的值和ID

行列转换:

$ awk '
    {
      for(i=1;i<=NF;i++){
        if(!(i in arr)){
          arr[i]=$i
        } else {
            arr[i]=arr[i]" "$i
        }
      }
    }
    END{
        for(i=1;i<=NF;i++){
            print arr[i]
        }
    }
' awk_case.txt

实现行列转换

上一篇 下一篇

猜你喜欢

热点阅读