2016-09-01 54 views
0

我輸出的命令如此處所示。如何使用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 

回答

2

一種方法是「從數據中刪除最後一個八柱」:

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 }' 

如果你設置了shell變量howmany=6,你會看到「SPEED」和「NCPU」列得:

ID SPEED NCPU 
p1 100 1 
a2 100 1 
b2 b3 100 1 
c3 c4 c5 100 1 

測試了BSD和GNU變種awk

+0

這是依靠不確定的行爲,因此因人而異。 POSIX定義瞭如果你增加'NF'(你得到一堆額外的空字段)會發生什麼,但是當你減少它時會發生什麼,這是留給實現的。儘管你可以通過'sub(/(+ [^] +){8} $ /,「」)'得到一個POSIX方法。 –

+0

這似乎是一個公平的評論 - 至少每個POSIX ['awk'](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html) 規範。您可以通過分配給超出當前值的字段來增加'NF':$(NF + 1)= 6; $(NF + 1)= 7;'實際上分配給兩個不同的領域,這並不明顯。目前還不清楚定義了「NF + = 2」還是定義了「NF - = 7」。它恰好工作;目前還不清楚它是否必須奏效。 –

1
$ awk 'NR>1{$0=substr($0,1,26); $1=$1; print}' file 
p1 
a2 
b2 b3 
c3 c4 c5 

但請注意,要處理,你有固定的寬域一般的解決方法是使用GNU awk的FIELDWIDTHS變量,而不是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()去除領先空間。請參閱:

0

我還要補充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等等看它

0

如果用於字段中的字符數是固定的

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 
相關問題