linux awk_linux中awk排除某列输出的实现示例

更新时间:2020-11-06    来源:linux    手机版     字体:

【www.bbyears.com--linux】


awk工具在文本处理上非常强大,我们常用的用法是选择某列输出,如print $1,$3 。不过在特殊的情况下,也会遇到只排除例个某列,其他列都正常输出 。针对 awk排除某列,这里就做个小总结。

比如我的文件如下:

[root@361way tmp]# more disk_io
xvda              1.49         2.37        11.71   10615426   52410436
xvdb              3.50         6.60        80.08   29535297  358410976
xvda              0.00         0.00         0.00          0          0
xvdb              5.05        12.12        72.73         12         72

排除第一列(打印第2列到最后):


awk "{$1=""; print $0}"    文件名

排除多列:

awk "{$1=$2=""; print $0}"  文件名

以上这种写法感觉是比较好的,不过如果前面排除的列比较多,且按顺序过来的,可以使用如下的方法 ,比较方便:

awk "{for(i=2;i<=NF;i++){printf "%s ", $i}; printf "\n"}"
awk "{out=$2; for(i=3;i<=NF;i++){out=out" "$i}; print out}"
awk "{print substr($0,length($1)+1);}"
awk "{ORS=" "; for(i=4;i<=NF;i++) print $i;print "\n"}"
awk "{sub(/([^ ]+ +){3}/,"")}1"

还有其他一些衍生写法如下:

awk "{sub(/[^ ]+ /, ""); print $0}"
awk "{$1=$2=$3=""}sub("^"FS"*","")"
awk -v n=3 "{ for (i=n+1; i<=NF; i++){printf("%s%s",$i,i==NF?RS:OFS);} }"

也可以通过一个脚本进行引用搞定,如下:

脚本1:

[root@361way tmp]# cat cols.sh
#!/bin/bash
awk -v s=$1 "{for(i=s; i<=NF;i++) printf "%-5s", $i; print "" }"

进行切分操作的命令如下:

# cat  文件名 |  ./cols.sh 3
# cat  文件名 |  ./cols.sh 5

脚本2:

脚本1还可以做下午简单的修改,变成脚本2,可以指定一个范围,如下:

#!/bin/bash
awk -v s=$1 -v e=$2 "{for(i=s; i<=e;i++) printf "%-5s", $i; print "" }"

使用命令如下:

echo "1 2 3 4 5 6 7 8 9 10 11 12 13 14" | ./cols.sh 7 9

本文来源:http://www.bbyears.com/caozuoxitong/109059.html