1

簡単な質問がありますが、このフォーラムや awk 学習サイトで見つけるにはあまりにも単純すぎます。

数字で始まる行に一致する awk コードがあり、その行の 6 列目を出力します。

/^[1-9]/ {   
print $6 
}

一致した列の最初の 50 行のみを印刷するように指示するにはどうすればよいですか?


追加の質問

以下の独自のバージョンの回答を使用してみましたが、50行印刷できました。ただし、現在、印刷する 50 行を選択しようとしています。これを行うには、数字で始まり「residue」という単語を含む行をスキップします。次に、数字で始まり「w」を含む 5 行をスキップします。この方法は、残基のある行をスキップするだけであるかのように機能し、その後の数字で始まる最初の行から印刷されます。私の「w」が考慮されていない理由を知っていますか。

#!/usr/bin/awk -f

BEGIN {
    line  = 0;
    skipW = 0;
}


# Ignore all lines beginning with a number until I find one I'm interested in.
/^[0-9]+ residue/ { next }

# Ignore the first five lines beginning with a number followed by a 'w'.
/^[0-9]+ w/ { 
    skipW += 1;
    if (skipW <= 5) next
}

# For all other lines beginning with a number, perform the following.  If we are
# "printing", increment the line count.  When we've printed 50 lines turn off
# printing from that point on.
/^[0-9]+/ { 
    ++line
    if ((line > 0) && (line <= 50)) print $6
}
4

2 に答える 2

3

条件の一部として一致カウンターを使用します。

/^[1-9]/ && matched < 50 {
    print $6
    matched++
}

ショートカットメソッドも使用できます。

/^[1-9]/ { print $6; matched++ }
matched == 50 { exit }

ただし、プロデューサーコマンドが正常に処理されない場合、これは常にパイプラインで機能するとは限りませんSIGPIPE

于 2012-10-03T18:08:15.753 に答える
2
awk '/^[1-9]/ { if (num_printed++ < 50) print $6 }'

num_printedこれは、一致が見つかるたびにインクリメントされ、最初の 50 行が入力ファイル内のどこにあるかに関係なく出力されます。

これにより、すべての入力が読み取られます。早期終了が問題ない場合は、次を使用できます。

awk '/^[1-9]/ { print $6; if (++num_printed == 50) exit }'

ポストインクリメントからプリインクリメントへの切り替えに注意してください。

于 2012-10-03T18:12:16.403 に答える