0

異なる列への複数行のエントリについて助けが必要です。ファイル内のすべてのエントリに対して同じことを行います。

ファイルの例 (2 つのエントリのみを示しています。このようなものが多数あります):

>ABC
*
AGA-AUUCUC-CGGUUCAAUCU
|||
UCUAUAACCGCGCCGAGUUAGU

>ABC
*
AGAUAU-GCUGCAGGCUCAAUUG
||||||
UCUAUAACCGCG-CCGAGUUAGU

必要なファイル形式:

>ABC AGA-AUUCUC-CGGUUCAAUCU UCUAUAACCGCGCCGAGUUAGU
>ABC AGAUAU-GCUGCAGGCUCAAUUG UCUAUAACCGCG-CCGAGUUAGU

次の方法で、単一のエントリを必要な形式に変換できます。

tr '\n' '\t' <test3 | awk '{print $1,$3,$5}'

しかし、ファイル全体を読み取ってすべてのエントリでそれを行うにはどうすればよいですか?

4

3 に答える 3

1

awk次のように使用できます。

awk 'NR%2 { printf "%s%s", $0, (NR+1)%6 ? " " : "\n" }' < test


説明:

について、次の 2 つのことを知っておく必要がありますawk

  • 構文は ですcondition { commands }。が真 (ゼロ以外) の場合にcommands実行されます。condition

  • NR1 から始まる現在のレコードの番号 (つまり、行番号) です。


ここで、条件はNR%2で、奇数行では非ゼロです。したがって、コマンドは、印刷したい奇数行に対してのみ実行されます。偶数行は黙って破棄されます。

printf奇数行ごとに出力し、その後にスペースまたは改行が続きます。入力は 6 行ごとに繰り返され、5、11、17などの行の後に改行が必要です。これらの数値のそれぞれに 1 を加算して 6 で割り切れるようにすることができるため、(NR+1)%6これらの数値の式は 0 です。

したがって(NR+1)%6 ? " " : "\n"、1 行目と 3 行目は空白、5 行目は改行と評価されます。次に、7、9、11 で繰り返されます。等々。

于 2012-02-17T02:49:39.420 に答える
0

Perlを使用する1つの方法は次のとおりです。

perl -ne 'chomp; if($. % 2 == 1) { print $_, ($. % 6 == 5) ? "\n" : "\t" }'

これにより、ファイルの1行目、3行目、5行目、7行目などが印刷されます。5、11、17などの行の後に、改行が出力されます。他の行の後には、タブのみが印刷されます。

(注:これは、5行の連続するグループの間に空白行が1つだけあることを前提としています。そうでない場合は、明確にしてください。)

于 2012-02-17T02:15:38.513 に答える
0

awk元のソリューションで正しい軌道に乗っていたと思います。これを試して; 読みやすく効果的な組み合わせだと思います:

awk 'BEGIN { RS="\n\n" } ; { print $1, $3, $5 }' < myfile

アイデアは、空白行 (2 つの連続する改行) をレコード区切りとして扱うように awk に指示することです。次に、各スタンザは単一のレコードとして扱われ、空白 (この場合は単一の改行) がフィールドを区切ります。trこれは、 awk が一度にスタンザを処理するファイル全体を実行することを除いて、 で行っていたこととかなり似ています。

于 2012-02-17T05:18:06.457 に答える