我有一个文件,其中包含由制表符分隔的多个字段。我正在尝试打印除第一列之外的所有列,但希望仅使用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列大于2的n而不打印空行,如果该行的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 :(得分:10)
这是你想要的输出吗?
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
中的最后一个字段,则非常有用。或者当然,如果你想迭代给定行上的全部或部分字段到行尾。
答案 1 :(得分:4)
似乎awk
是错误的工具。我愿意:
cut -f 2- < bth.data | tr -s '\t' '\n'
请注意,对于-s
,这可以避免打印原始问题中所述的空行。