2011-06-10 84 views
2

我想對我在awk中遇到的問題提供幫助或指導。打印字段'N'到行尾

我有一個帶有超過5個字段的製表符分隔的文件。我想輸出除前5個字段之外的字段。

請問如何編寫awk腳本來完成此任務?

最佳, jianfeng.mao

請注意以下那種評論:

有在我的文件很多領域。不同的行具有不同數量的字段。每行的字段數量不是標準的。

+0

你有一套標準的字段嗎?或者實地計數是否有所不同?例如有時6場有時10場? – matchew 2011-06-10 14:35:12

+0

是的,有很多領域。具有不同字段數的不同文件。我不知道他們有多少人。 – 2011-06-10 14:39:50

+2

不要忘記接受回答你的問題的答案。 – ssapkota 2011-06-11 19:16:41

回答

3

我同意matchew建議使用cut:這是適合這份工作的正確工具。但是,如果這僅僅是要成爲一個更大的awk腳本的一部分,這裏是如何做到這一點:

awk -F "\t" '{ for (i=6; i<=NF; ++i) $(i-5) = $i; NF = NF-5; print; } 
+0

尊敬的user349433,我現在正在嘗試從您的awk腳本中學習。非常感謝 – 2011-06-10 16:04:37

5

在我的製表符分隔的文件temp.txt它看起來像下面

字段1場2場3字段4字段5字段6
字段1場2場3字段4字段5字段6字段7
字段1場2場3字段4字段5字段6字段7場8

根據您的更新,我強烈建議使用cut

cut -f6- temp.txt 

將打印field6到行尾。

注意-d指定了分隔符,但tab是默認的分隔符。 您可以在awk中做到這一點,但我發現cut更簡單。

隨着awk它應該是這樣的:

awk '{print substr($0, index($0, $6))}' temp.txt 

如果我的製表符分隔的文件TEMP.TXT如下所示

字段1場2場3字段4字段5字段6
字段1場2場3 field4 field5 field6 field7
field1 field2 field3 field4 field5 field6 field7 field 8

awk -F"\t" '{print $6}' temp.txt 

,只打印第6場。如果分隔符是製表符,它可能沒有設置-F,但我喜歡在可能的時候設置字段分隔符。

同樣如此也會削減。

cut -f6 temp.txt 

我有一個預感你的問題有點複雜,那麼,如果你迴應我的評論,我可以嘗試和擴大我的答案。

+0

親愛的matchew。非常感謝您的幫助。 – 2011-06-10 14:42:39

+0

'cut'很簡單,但不處理不一致的分隔符(混合不同的空格)。在awk解決方案中使用'substr'的​​+1。 – 2011-06-10 15:00:41

2

perl的方式嗎?

perl -lane 'splice @F,0,5;print "@F"' 

所以,

echo 'field1 field2 field3 field4 field5 field6' | perl -lane 'splice @F,0,5;print "@F"' 

會產生

field6 
1
awk -vFS='\t' -vOFS='\t' '{ 
    $1=$2=$3=$4=$5="" 
    print substr($0,6) # delete leading tabs 
}' 

我用-vFS='\t'而不是-F'\t'因爲AWK的一些實現(如的BusyBox的)不孝敬下,在逃逸後者的結構。