我有一个命令的输出,如下所示。
ID SPEED NCPU PMEM VMEM EP NPROC IO IOPS
p1 100 1 1024M 1024M 20 100 1024 1024
a2 100 1 1024M 1024M 20 100 1024 1024
b2 b3 100 1 1024M 1024M 20 100 1024 1024
c3 c4 c5 100 1 1024M 1024M 20 100 0 1024
我需要过滤掉"ID"列下的值
命令awk '{print $1}
仅打印:
p1
a2
b2
c3
这不是期望的输出。
我要找的输出是.
p1
a2
b2 b3
c3 c4 c5
查看它的一种方法是"从数据中删除最后八列":
awk '{ $(NF-8+1) = ""; NF -= 8; print }'
输出:
ID
p1
a2
b2 b3
c3 c4 c5
如果不分配给$(NF-8+1)
,awk
认为$0
可能没有更改,所以它打印的行没有更改。$(NF-8+1)
的使用将允许您使用一个变量来指定要省略的尾部列数:
awk -v omit="${howmany:-8}" '{ $(NF-omit+1) = ""; NF -= omit; print }'
如果设置外壳变量howmany=6
,您还会看到"SPEED"one_answers"NCPU"列:
ID SPEED NCPU
p1 100 1
a2 100 1
b2 b3 100 1
c3 c4 c5 100 1
用BSD和GNU版本的awk
进行了测试。
$ awk 'NR>1{$0=substr($0,1,26); $1=$1; print}' file
p1
a2
b2 b3
c3 c4 c5
但是,请注意,处理固定宽度字段的一般解决方案是使用GNU awk的FIELDVIDTHS变量,而不是FS:
$ awk -v FIELDWIDTHS="26 8 8 8" '{for (i=1;i<=NF;i++) printf "<%s>%s", gensub(/^ +/,"",1,$i), (i<NF ? OFS : ORS)}' file
<ID> <SPEED> <NCPU> <PMEM>
<p1> <100> <1> <1024M>
<a2> <100> <1> <1024M>
<b2 b3> <100> <1> <1024M>
<c3 c4 c5> <100> <1> <1024M>
我添加了gensub((来删除前导空格。参见:
- https://www.gnu.org/software/gawk/manual/gawk.html#Constant-尺寸
- https://www.gnu.org/software/gawk/manual/gawk.html#String-功能
我还会添加sed选项:
$ sed -ne '2,$s/^[ ]+//g; s/(.*[[:alpha:]][[:digit:]]).*/1/p' file
p1
a2
b2 b3
c3 c4 c5
其中:
2,$ - start with 2nd line
s/^[ ]+//g - remove leading spaces
s/(.*[[:alpha:]][[:digit:]]).*/1/p - match until last [alpha][digit] and print only that part
注意:我假设ID总是像a1
或b2
等。
如果字段的字符数是固定的
grep -oE '^.{26}' file
如果不需要第一行,则将输出管道传输到tail -n +2
。。或使用sed
sed -nE '2,$ s/^(.{26}).*/1/p' file
如果字段数是固定的:
$ sed -nE '2,$ s/(s+S+){8}$//p' file
p1
a2
b2 b3
c3 c4 c5