2012-08-08 66 views
4

我有一个文件,其中包含许多由选项卡分隔的字段。我试图打印除第一个列以外的所有列,但只想在一个带有AWK的列中全部打印。文件格式为Awk:打印未确定数量的列

col 1 col 2 ... col n 

一行至少有2列。

样品

2012029754  901749095 
2012028240  901744459  258789 
2012024782  901735922 
2012026032  901738573  257784 
2012027260  901742004 
2003062290  901738925  257813 257822 
2012026806  901741040 
2012024252  901733947  257493 
2012024365  901733700 
2012030848  901751693  260720 260956 264843 264844 

所以我想告诉awk将打印列2到列n对于n大于2,但不打印空白行当存在该行的列N无信息,尽在一列如下。

901749095 
901744459 
258789 
901735922 
901738573 
257784 
901742004 
901738925 
257813 
257822 
901741040 
901733947 
257493 
901733700 
901751693 
260720 
260956 
264843 
264844 

这是我第一次用awk,所以大家多多包涵。我写这个命令行其工作原理:

awk '{i=2; 
while ($i ~ /[0-9]+/) 
{ 
    printf "%s\n", $i 
    i++ 
} 
}' bth.data 

它比问一个问题,无论是在AWK做这样的事情的正确方法还是有做的更好/更短的方式更多的是寻求批准的它。

请注意,实际的输入文件可能是数百万行。

谢谢

+0

我有点困惑你期望输出什么,你能给你显示的输入提供一些示例输出吗?您是否尝试跳过第1列并打印其他所有内容? – Levon 2012-08-08 23:24:44

+0

因此,'cut -f 2-bth.data'不会做你想要的吗? – Neil 2012-08-08 23:25:16

+0

更新了问题。 – Hameed 2012-08-08 23:25:39

回答

9

这是你想要的输出?

awk '{for(i=2; i<=NF; i++) print $i}' bth.data 

901749095 
901744459 
258789 
901735922 
901738573 
257784 
901742004 
901738925 
257813 
257822 
901741040 
901733947 
257493 
901733700 
901751693 
260720 
260956 
264843 
264844 

NF是几个pre-defined awk variables之一。它表示给定输入行上的字段数量。例如,如果您想要始终打印出一行print $NF中的最后一个字段,这很有用。或者当然如果你想遍历给定行上的全部或部分字段到行尾。

+0

是的。因此,NF是特定行中的字段数,我假设? – Hameed 2012-08-08 23:31:37

+0

@Hameed是的,这是正确的,我只是想添加一些解释的答案:) – Levon 2012-08-08 23:32:18

+0

太棒了。谢谢。 – Hameed 2012-08-08 23:39:46

2

似乎是awk是错误的工具。我会做:

cut -f 2- < bth.data | tr -s '\t' '\n' 

注意与-s,这样就避免了打印空白行作为原始问题陈述。

+0

谢谢。这也适用,但是我原来的问题是关于AWK的,所以我不想不接受上面的答案。 :) – Hameed 2012-08-13 05:31:38