2011-06-10 39 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的)不孝敬下,在逃逸后者的结构。