極端なテキストファイル操作(列追加、列内容変更)

極端なテキストファイル操作(列追加、列内容変更)

私は次のようなレイアウト(列/変数)を持つ非常に大きな(80GB)ファイルセット(ゲノム変形容量)を持っています。現在「.txt.gz」です。

Chr RSID POS REF ALT Ind1 Ind2...Ind(n) ここで、1:n は個別です。

このファイルを次のように編集したいと思います。

  1. Chr列/変数は、すべての行(たとえば3)に対して特定の染色体番号に設定されます。

  2. 新しい列がファイル内の特定の場所に挿入されます。新しい列/変数をALTとInd1の間に挿入して、新しい列が編集されたファイルの6番目の列になるようにしたいと思います。また、この列の値を定数(例:0)に設定したいと思います。

最後に編集したファイルを読み込んだのと同じ形式で出力したいと思います。したがって、出力は ".txt.gz"でなければなりません。

お手伝いいただきありがとうございます。詳細をお知らせします。

答え1

ファイルを解凍し、圧縮されていないデータストリームを渡して変更するようにし、圧縮awkawkためにストリームを渡しますgzip

gzip -c -d <file.txt.gz |
awk -F '\t' 'BEGIN { OFS = FS } { $1 = 3; $6 = 0 OFS $6 }; 1' |
gzip -c >newfile.txt.gz

このawkコマンドは、入力フィールド区切り記号(FS)と出力フィールド区切り記号(OFS)をタブ文字に設定します。次に、最初のフィールドをに設定3し、6番目のフィールドをに設定し、タブと前の06番目のフィールドを設定します。

1スクリプトの最後の別のセクションでは、変更されたawkデータが出力されます。

入力はawk解凍されたデータストリームでgzip -dあり、出力は圧縮されawkますgzip

データにヘッダー行がある場合は、個別に変更する必要があります。

gzip -c -d <file.txt.gz |
awk -F '\t' 'BEGIN { OFS = FS }
    NR == 1 {         $6 = "NEW" OFS $6 }
    NR != 1 { $1 = 3; $6 = 0     OFS $6 }; 1' |
gzip -c >newfile.txt.gz

ここでは、入力行番号に応じてさまざまな操作を行います。行1にある場合は、ヘッダーをNEW新しい6番目のフィールドのヘッダーとして挿入します。行 1 でない場合は、前と同様にデータを変更します。

としてこれを行うこともできますが、sed質問にマークするときにawk使用することを好むツールであるとします。

答え2

gawk、mawk-1、mawk-2、およびnawkで動作することが確認されています。

(…gunzip…)\
 \
 |  mawk 'BEGIN { _+=___=_+=(__=_^=OFS=FS="\t")+_ }\
                $_=(__==NR?"NEW":_<($__=___))FS $_'\
 | (…re-gzip…)

関連情報