7

タブで区切られたいくつかのフィールドを含むファイルがあります。最初の列を除くすべての列を印刷しようとしていますが、AWKを使用してすべての列を1つの列にのみ印刷したいと考えています。ファイルの形式は次のとおりです。

col 1   col 2   ... col n

1行に少なくとも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

したがって、次のように、その行の列nに情報がない場合に、空白行を印刷せずに、列2から列nに2より大きいnを印刷するようにawkに指示します。

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でこのようなことを行う正しい方法なのか、それともより良い/より短い方法があるのか​​を質問するよりも、承認を求めることです。

実際の入力ファイルは数百万行になる可能性があることに注意してください。

ありがとう

4

2 に答える 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変数の1つです。特定の入力行のフィールド数を示します。たとえば、行の最後のフィールドを常に印刷する場合に便利ですprint $NF。またはもちろん、特定の行のフィールドのすべてまたは一部を行の終わりまで反復処理する場合。

于 2012-08-08T23:28:12.960 に答える
4

awk間違ったツールのようです。私はします:

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

-sを使用すると、元の問題で述べられているような空白行の印刷が回避されることに注意してください。

于 2012-08-10T19:21:21.610 に答える