16

奇数行 (1,3,5,7..) を変更せずに出力したいのですが、偶数行 (2,4,6,8) は grep で始まるパイプラインで処理されます。すべてを新しいファイルに書き込みたいと思います(変更のない奇数行と偶数行の新しい値)。

awkで1行おきに印刷する方法を知っています:

awk ' NR % 2 == 1 { print; } NR % 2 ==0 {print; }' file.fasta

ただし、偶数行の場合は使用したくあり{print; }ませんが、代わりに grep パイプラインを使用したいと考えています。

アドバイスをいただければ幸いです。どうもありがとう。

4

3 に答える 3

15

単純なgrep.

awk 'NR % 2 {print} !(NR % 2) && /pattern/ {print}' file.fasta

ただし、さらに多くのことを行う場合は、chepner がすでに指摘しているように、実際に awk 内からパイプすることができます。例えば:

awk 'NR % 2 {print} !(NR % 2) {print | "grep pattern | rev" }' file.fasta

これにより、コマンドへのパイプが開き"grep pattern | rev"(引用符で囲まれていることに注意してください)、印刷出力がそこにリダイレクトされます。この場合の出力は、期待どおりにならない可能性があることに注意してください。すべての奇数行が最初に出力され、その後にパイプ コマンドの出力が続きます (これは偶数行を消費します)。


(あなたのコメントに応えて)各偶数行の文字数を数えるには、次を試してください:

awk 'NR % 2 {print} !(NR % 2) {print length($0)}' file.fasta
于 2012-07-19T12:19:16.880 に答える
8

内部から直接パイプできますawk

awk ' NR % 2 == 1 { print; } NR % 2 ==0 {print | "grep -o [actgnACTGN] | wc -l"; }' file.fasta

ただし、これは入力ファイルの順序を保持しないことに注意してください。

(選択した回答は、当面のタスクには適していますが、print ステートメントを外部コマンドにパイプする例として、この回答をここに残しておきます。)

于 2012-07-19T12:13:12.300 に答える
2

パイプライン出力をAWK出力と順番に表示するには、反復ごとにパイプラインを閉じる必要があります。もちろん、これは非常に非効率的です。

awk 'BEGIN{ cmd = "grep -io \047[actgn]\047 | wc -l" } NR % 2 { print } NR % 2 == 0 { print | cmd; close(cmd) }' file.fasta

指定されたリストにない文字を数えたくないので、機能しlength($0)ません。これは機能し、パイプライン方式よりもはるかに高速である必要があります。

awk 'NR % 2 { print } NR % 2 == 0 {n = split($0, a, /[^actgnACTGN]/); print length($0) - n + 1}' file.fasta

これは、区切り文字として不要な文字を使用して行を分割し、行の長さから部分文字列の数を減算して1を加算することで機能します。本質的には、行の長さから不要な文字の数を減算します。結果として必要な文字の数。

于 2012-07-19T13:58:33.487 に答える