如果使用awk或sed将行向右对齐,如何过滤字符



我有一个命令的输出,如下所示。

                        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总是像a1b2等。

如果字段的字符数是固定的

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

最新更新