私は次のようなレイアウト(列/変数)を持つ非常に大きな(80GB)ファイルセット(ゲノム変形容量)を持っています。現在「.txt.gz」です。
Chr RSID POS REF ALT Ind1 Ind2...Ind(n) ここで、1:n は個別です。
このファイルを次のように編集したいと思います。
Chr列/変数は、すべての行(たとえば3)に対して特定の染色体番号に設定されます。
新しい列がファイル内の特定の場所に挿入されます。新しい列/変数をALTとInd1の間に挿入して、新しい列が編集されたファイルの6番目の列になるようにしたいと思います。また、この列の値を定数(例:0)に設定したいと思います。
最後に編集したファイルを読み込んだのと同じ形式で出力したいと思います。したがって、出力は ".txt.gz"でなければなりません。
お手伝いいただきありがとうございます。詳細をお知らせします。
答え1
ファイルを解凍し、圧縮されていないデータストリームを渡して変更するようにし、圧縮awk
のawk
ためにストリームを渡します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番目のフィールドをに設定し、タブと前の0
6番目のフィールドを設定します。
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…)