Linux命令-awk案例
使用的示例文件如下:
$ 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
实现行列转换
除非注明,文章均为原创,转载请以链接形式标注本文地址
本文地址:http://colorfulbiolife.com/baseability/linux/linux%e5%91%bd%e4%bb%a4-awk%e6%a1%88%e4%be%8b/