ファイルからデータを抽出し、内容を操作して新しいファイルに書き込みます。

ファイルからデータを抽出し、内容を操作して新しいファイルに書き込みます。

私に関連するデータを抽出するcsvファイルがあります。一方には参照番号があり、一方には文字G、A、T、Cの形の遺伝情報があります。

コンテンツCSV:

1,S188823,188823,,,,ACTCTCGA,,CTGTACCA,ID23,
1,S189843,189843,,,,ACCCTGGA,,CTTGTACA,ID23,
...

私に関連する情報は188823,,,,ACCCTGGA,,CTTGTACA すべての行から来ます。このプロセスでは、重複エントリを削除する必要があります。最初の2行も切り取る必要があります。

これが私が現在やっていることです:

cat File.csv | cut -d "," -f 3,9,7 | uniq | sed -e '1d' -e '2d'

結果は次のとおりです。

188823,ACTCTCGA,CTGTACCA
189843,ACCCTGGA,CTTGTACA
...

しかし、今やるべきことは2つありましたが、私は失敗しました。フィールド3とフィールド2を交換する必要があります。

188823,CTGTACCA,ACTCTCGA
189843,CTTGTACA,ACCCTGGA
...

フィールド2から始めて、塩基は「逆相補的」でなければなりません。つまり、すべての A が T になり、すべての C が G になり、すべての G が C になり、すべての T が A になり、シーケンスの順序が逆であるという意味です。したがってにCTGTACCAなりますTGGTACAG

最終結果は次のようになります。

188823,TGGTACAG,ACTCTCGA
188823,TGTACAAG,ACCCTGGA

これが理解できることを願って、私を助けることができることを願っています。リバースコンフィギュレーションのヘルプはここにあります。 オンラインRevCompジェネレータ

ベストアンサー1

GNUの使用awk:

awk -F, '!seen[$3 FS $9 FS $7]++ {
    cmd="echo \047" $9 "\047 | rev | tr ATCG TAGC";
    if ((cmd |getline $9)>0){ print $3, $9, $7; };
    close(cmd);
}' OFS=, infile

出力:

188823,TGGTACAG,ACTCTCGA
189843,TGTACAAG,ACCCTGGA

NR>2コマンドに追加すると、awk 'NR>2{ ...; }'入力の最初の2行をスキップするように機能します。

ここでは[getlineパイプから変数への変換] cmd="..." $9 "..." (外部コマンドに関連する項目だけが二重引用符で囲まれています。)次に、パイプから呼び出してgetline同じフィールドに結果を保存し、$9結果getlineが成功すると出力に必須フィールドを印刷します。

最後に、閉鎖(ガイドライン)これ注文する我々は開いた。

!seen[$3 FS $9 FS $7]++処理フィールド#3、#9、#7の重複行を無視するために使用されます。

おすすめ記事