有時我們需要將某個域之後的所有域打印出來,而且每個記錄(行)的域的個數也不一定,所以用“$4,$5,…..$n,….$(NF-1),$NF”窮舉是不現時的,我經過測試,總結了一下實現的方法,供大家參考。
// 測試文件內容
[root@cacti tmp]# cat file.txt
x1 x2 x3
x1 x2 x3 x4 x5
x1 x2 x3 x4 x5 x6
x1 x2 x3 x4 x5 x6 x7 x8
x1 x2 x3 x4 x5 x6 x7
x4 x5 x6
x4 x5 x6 x7 x8
x4 x5 x6 x7
x4 x5 x6
x4 x5 x6 x7 x8
x4 x5 x6 x7
1) 在NF不夠4個的記錄(行),將會打印出一個空行;
2) 在輸出的結果中,每行結尾多了一個空格;
[root@cacti tmp]# awk '{for(i=4;i<=NF;i++) printf"%s ",$i};NF>4 {print ""}' file.txt
x4 x5
x4 x5 x6
x4 x5 x6 x7 x8
x4 x5 x6 x7
x4 x5
x4 x5 x6
x4 x5 x6 x7 x8
x4 x5 x6 x7
// 測試文件內容
[root@cacti tmp]# cat file.txt
x1 x2 x3
x1 x2 x3 x4 x5
x1 x2 x3 x4 x5 x6
x1 x2 x3 x4 x5 x6 x7 x8
x1 x2 x3 x4 x5 x6 x7
x1 x2 x3
x4 x5
x4 x5 x6
x4 x5 x6 x7 x8
x4 x5 x6 x7
[root@cacti tmp]# cat file.txt |awk 'NF>4 {a=index($0,$4);print substr($0,a)}'
x4 x5
x4 x5 x6
x4 x5 x6 x7 x8
x4 x5 x6 x7
[root@cacti tmp]# cat filexx.txt
x1 x2 x3
x1 x4 x3 x4 x5
x1 x4 x4 x4 x5 x6
x4 x2 x3 x4 x5 x6 x7 x8
x1 x2 x3 x4 x4 x6 x7
(本文件,可以發現$4的字串:x4,在2,3,4,5行,在$4之前的域都有出現過與之相同的字串:x4)
//下面是用上面的方法,結果顯然有誤的,是將以x4開始的域之後的所有域全打印出來了。
[root@cacti tmp]# cat filexx.txt |awk 'NF>4 {a=index($0,$4);print substr($0,a)}'
x4 x3 x4 x5
x4 x4 x4 x5 x6
x4 x2 x3 x4 x5 x6 x7 x8
x4 x4 x6 x7
[root@cacti tmp]# cat filexx.txt |awk 'NF>4 {$4="z"$4;a=index($0,$4);print substr($0,a)}'
zx4 x5
zx4 x5 x6
zx4 x5 x6 x7 x8
zx4 x4 x6 x7
[root@cacti tmp]# cat filexx.txt |awk 'NF>4 {$4="n"$4;a=index($0,$4);print substr($0,a+1)}'
x4 x5
x4 x5 x6
x4 x5 x6 x7 x8
x4 x4 x6 x7
[root@cacti tmp]# cat filexx.txt |awk 'BIGIN{FS="[ ]"} NF>4 {$4="n"$4;a=index($0,$4);print substr($0,a+1)}'
x4 x5
x4 x5 x6
x4 x5 x6 x7 x8
x4 x4 x6 x7
就是將某個(些)域替換成空值,如去除第一個域爲:awk '{ $1=""; print $0 }' file.in
// 測試文件內容
[root@cacti tmp]# cat file.txt
x1 x2 x3
x1 x2 x3 x4 x5
x1 x2 x3 x4 x5 x6
x1 x2 x3 x4 x5 x6 x7 x8
x1 x2 x3 x4 x5 x6 x7
[root@cacti tmp]# awk '{ for(i=1;i<=3;i++){$i="a"}; print $0 }' file.txt
a a a
a a a x4 x5
a a a x4 x5 x6
a a a x4 x5 x6 x7 x8
a a a x4 x5 x6 x7
[root@cacti tmp]# awk '{ for(i=1;i<=3;i++){$i=""}; print $0 }' file.txt
x4 x5
x4 x5 x6
x4 x5 x6 x7 x8
x4 x5 x6 x7
問題:
1) 在NF不夠4個的記錄(行),將會打印出一個空行;
2) 在輸出的結果中,去除的域會用空格來代替
[root@cacti tmp]# awk 'NF>4 { for(i=1;i<=3;i++){$i=""}; print $0 }' file.txt
x4 x5
x4 x5 x6
x4 x5 x6 x7 x8
x4 x5 x6 x7
本文介紹了三種方法來解決AWK“只打印第N個域之後的所有域”的問題。