【问题标题】:Awk: printing undetermined number of columnsawk:打印未确定的列数
【发布时间】:2012-08-06 03:51:07
【问题描述】:

我有一个文件,其中包含许多由制表符分隔的字段。我正在尝试打印除第一列之外的所有列,但希望使用 AWK 仅在 one 列中打印它们。文件格式为

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 中这样做是否是正确的方法,或者是否有更好/更短的方法。

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

谢谢

【问题讨论】:

  • 我对您期望的输出有点困惑,您能否为您显示的输入提供一些示例输出?您是否要跳过第 1 列并打印其他所有内容?
  • 那么,cut -f 2- bth.data 没有做你想做的事?
  • 谢谢 Neil,但我想要一栏。
  • 您不是缺少输出中的第一个数字(第 1 行中的第 2 列 901749095)吗?

标签: awk


【解决方案1】:

这是你想要的输出吗?

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 行中的最后一个字段,它会很有用。或者,当然,如果您想遍历给定行上的全部或部分字段,直到行尾。

【讨论】:

  • 是的。所以我假设 NF 是特定行中的字段数?
  • @Hameed 是的,这是正确的,我正要为答案添加一些解释:)
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢。这也有效,但是我最初的问题是关于 AWK,所以我不想不接受上述答案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多