余分なスペースで不規則なタイトルを変更する

余分なスペースで不規則なタイトルを変更する

データを処理しています。このあいまいなファイル形式:

   SNP  A1  A2   F1 I1 F2 I2 F3 I3
rs0001   A   C   0.02 0.00 1.99

(最初の3フィールドの周りのスペースに注意してください)

タイトルが非常に長く(500,000項目)、次のように変換したいと思います。

   SNP  A1  A2   F1_I1 F2_I2 F3_I3
rs0001   A   C   0.02 0.00 1.99

...不規則なスペースを削除または削除せずに使用する方が簡単です。参考までに、一貫性がある限り、これは許可されます。

SNP A1 A2 F1_I1 F2_I2 F3_I3
rs0001 A C 0.02 0.00 1.99

Unix / Linuxで再フォーマットする方法はありますか?ありがとう

答え1

あなたがリンクしたplinkファイル形式の仕様には奇妙な詳細がたくさん含まれています。

まず、「F1 I1」と「F2 I2」が2つの異なる(ただし関連する)列のヘッダを明確に表すいくつかの例は次のとおりです。

    SNP  A1  A2   F1 I1       F2 I2        F3 I3
 rs0001   A   C   0.98 0.02   1.00 0.00    0.00 0.01 
 rs0002   G   A   0.00 1.00   0.00 0.00    0.99 0.01  

Ixしかし、ヘッダーがあるにもかかわらず、列値が欠落しているように見える例も提供しました。

    SNP  A1  A2   F1 I1 F2 I2 F3 I3
 rs0001   A   C   0.02 0.00 1.99

この例が間違っているのか、データが実際にこのようにフォーマットされているのかはわかりません。このオプションに関する説明は、dose1「線量データは0..2尺度ではなく0..1です」という一般的な2つの列形式の代わりに1列の線量データを使用できることを示唆しているようです.私の直感では、1つの値のみを提供するサンプルデータのタイトルが混乱しているようです。

仕様の理解と部分的に一致する不正確な仕様とデータの処理方法は常に困難です。間違ったデータにフラグを表示すると同時に、マイナーなヘッダーの問題を持つファイルを正しく処理できるように、データパーサーの許容範囲を決定する必要があります。

実際のファイル処理に関する質問について:ファイルに単一値または二重値線量データがあるかどうかを示す外部インジケータがある場合は、Ix使い慣れたスクリプトまたはテキスト処理言語を使用してヘッダーを完全に削除しsedます。awkperlpython

答え2

sed以下を使用して最初の行を上書きできます。

sed -E 's/(F[[:digit:]]+) (I[[:digit:]])/\1_\2/g;q' < file 1<> file

これは、最初の行のみを読み書きするために機能します。私たちが書いている行の長さが私たちが読んでいる行の長さとまったく同じであるため、これは有効です。Fnとの間に複数のスペースがありIn、スペースを1つだけに置き換える場合は、_この方法を使用できず、ファイル全体を再構築する必要があります。たとえば、次のようになります。

perl -pi -e 's/(F\d+)\s+(I\d)/${1}_${2}/g if $. == 1' file

fileこれにより、元のバージョンとして機能する新しい編集コピーが作成されます。たとえば、いくつかのsed実装はGNUを使用して-i進化しました。perlsed

sed -Ei '1s/(F[[:digit:]]+)\s+(I[[:digit:]])/\1_\2/g' file

動作します。他のsed実装の場合-i ''\s[[:space:]]

1つ以上の空白文字シーケンスを1つのスペースに置き換えるにはs/[[:space:]]+/ /g(次の操作を実行できます)perl-l

正規表現の一致はそれほど厳格ではありません。F<digits> I<digit>行のどこにでも見つかると、たとえば次のようになります。より厳格なマッチングは次のように行うことができます。PAF12 I0therperl

perl -pi -e 's/(?<!\S)(F\d+)\s+(I\d+)(?!\S)/${1}_${2}/g if $. == 1' file

ネガティブナビゲーション演算子を使用して、前後に空白以外の文字がないことを確認します。

関連情報