2012-07-19 7 views
10

奇数行(1,3,5,7 ..)を何も変更せずに印刷したいが、行(2,4,6,8)で始まるパイプラインで処理するgrep。私は新しいファイルにすべてを書きたいと思っています(奇数行は変更せずに、偶数行は新しい値)。私はawkでの他のすべての行に印刷する方法を知っているbashで1行おきに処理する方法

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

はしかし、偶数ラインのために、私は{print; }を使用したくないが、私は代わりに私はgrepのパイプラインを使用します。

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

+3

'== 1 {print;}'は冗長で、単に 'awk 'NR%2'が奇数行を印刷します' – Kevin

+0

助けてくれてありがとうございます! – Perlnika

答えて

8

grepシンプルな、あなたは例えば、追加のステップを廃止し、awkを自身の中にフィルタリングを行うことができます。

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

をしかし、あなたはchepner already pointer outよう、そしてもっと多くを行うつもりならば、あなたはすることができ、実際のパイプをawkの内側から。例えば:

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

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


しようと、各偶数ラインの文字の数をカウントします

awk 'NR % 2 {print} !(NR % 2) {print length($0)}' file.fasta 
+0

ありがとうございます。私は偶数行の文字の数を数えようとしています。 – Perlnika

+0

@Perlnikaあなたはawkの 'length'コマンドを使って文字数を取得できます。更新された回答をご覧ください。 –

+0

@ Perlnika、いくつかのfastaファイルには '-'や' X'のような奇数の文字が入っているかもしれませんが、OPが望んでいるものにおそらく答えました。 – Steve

6

あなたはできる直接awk内側からパイプ:

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

これは、入力ファイルの順序を保持しないこと、しかし、注意してください。あなたがすることを計画している場合

(選択した答えは、手元のタスクのためのより良いですが、私は外部コマンドにprint文配管の一例として、ここでは、この答えを残しておきます。)

+0

ありがとう、私はこれをawk 'NR%2 == 1 {print; } NR%2 == 0 {print | grep -o [actgnACTGN] | wc -l} 'ファイルを作成します。(行の文字の数をカウントするために)しかし、awc:行1:またはwcの近くの構文エラー(私は問題が私のパイプラインにあると思いますので): – Perlnika

+0

あなたはどういう意味ですか?注文を保存しますか? – Perlnika

+0

@Perlnika彼は、すべての奇数行が最初に出力され、その後にパイプの出力(すべての偶数行を消費する)で終わることを意味します。 –

1

あなたのパイプラインの出力は、あなたの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 

それはあなたがが区切り文字としてしたいとの長さからストリングの数を引いていない文字を使用して行を分割することによって動作します本質的に、行の長さから望ましくない文字の数を差し引いて、結果として所望の文字の数を残す。

関連する問題