シェルの列ベースの列にベースのエントリを変換します
-
27-10-2019 - |
質問
異なる列への複数の行エントリであなたの助けが必要です。また、ファイル内のすべてのエントリで同じことを行います。
ファイルの例(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}'
しかし、ファイル全体を読み取ることで、すべてのエントリでそれを行うにはどうすればよいですか?
解決
私はあなたがあなたのオリジナルと一緒に正しい軌道に乗っていたと思います awk
解決。これを試して;読みやすく効果的な良い組み合わせだと思います:
awk 'BEGIN { RS="\n\n" } ; { print $1, $3, $5 }' < myfile
アイデアは、awkに空白線(2連続のニューライン)をレコードセパレーターとして扱うように指示することです。次に、各スタンザは単一のレコードとして扱われ、空白(この場合は単一のニューライン)がフィールドを分離します。これはあなたがやっていたこととかなり似ています tr
, 、今を除いて、awkは一度にスタンザを処理するファイル全体を実行します。
他のヒント
使用できます awk
このような:
awk 'NR%2 { printf "%s%s", $0, (NR+1)%6 ? " " : "\n" }' < test
説明:
これらの2つのことを知る必要があります awk
:
構文はです
condition { commands }
, 、 どこcommands
場合は実行されますcondition
True(ゼロ以外)です。NR
1で始まる現在のレコード(つまり、行番号)の数です。
ここで、状態はです NR%2
, 、奇数の行の場合はゼロではありません。そのため、コマンドは奇妙な数の行でのみ実行されます。これは、印刷したい行です。偶数の線は静かに廃棄されます。
printf
すべての奇妙な線を印刷し、その後、スペースまたは新しいラインのいずれかを印刷します。入力は6行ごとに繰り返され、5、11、17行の後に新しいラインが必要です。 等. 。これらの数値のそれぞれに1を追加して6で割り切れることができるため、式 (NR+1)%6
これらの数値は0です。
そう (NR+1)%6 ? " " : "\n"
1行目と3のスペース、および5行目の新しいラインを評価します。その後、7、9、および11のために繰り返されます。等々。
Perlを使用する1つの方法は次のとおりです。
perl -ne 'chomp; if($. % 2 == 1) { print $_, ($. % 6 == 5) ? "\n" : "\t" }'
これにより、ファイルの行が1番目、3番目、5番目、7番目などが印刷されます。 5、11、17、などの後、newlineが印刷されます。他の行の後、タブのみを印刷します。
(注:これは、5行の連続したグループ間に1つの空白線があることを前提としています。 いいえ ケース、次に明確にしてください。)