Awk:打印不确定列数

8

我有一个包含多个由制表符分隔的字段的文件。 我想要打印除第一列之外的所有列,但希望将它们全部打印在 一个 列中,使用 AWK。 文件的格式为

col 1   col 2   ... col n

每行至少有两列。

示例

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中以这种方式进行操作,或者是否有更好/更短的方法。

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

谢谢。


我有点困惑你期望什么输出,你能给出一些输入对应的样例输出吗?你是想跳过第一列并打印其它所有内容吗? - Levon
1
那么,cut -f 2- bth.data 不是你想要的吗? - Neil
谢谢Neil,但我想要全部在一列中。 - Hameed
1
你的输出中没有第一个数字(第一行第2列的901749095),是不是漏掉了? - Levon
2个回答

12

这是您想要的输出吗?

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是多个预定义的awk变量之一。它指示给定输入行上字段的数量。例如,如果您想始终打印行中的最后一个字段print $NF,则非常有用。当然,如果您想迭代给定行上所有或部分字段直到行末,它也很有用。


是的。那么NF是指特定行中字段的数量,我猜测是这样吧? - Hameed
@Hameed 是的,没错,我正准备给答案加上一些解释 :) - Levon

4

看起来awk并不是正确的工具。我会这样做:

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

请注意,使用-s参数可以避免打印空行,这是原始问题中所述的。

谢谢。这个也可以,但是我的原始问题是关于AWK的,所以我不想取消接受上面的答案。 :) - Hameed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接