テキストファイルの2番目の列の一致に基づいて列の名前を変更する

テキストファイルの2番目の列の一致に基づいて列の名前を変更する

次の形式のファイルがあります。ファイル名はfile.txtです。

chr - seq1 NZ_JAHWGH010000010.1 0 60562 green_a4
chr - seq3 NZ_JAHWGH010000012.1 0 466573 green_a4
chr - seq5 NZ_JAHWGH010000013.1 0 125526 green_a4
chr - seq6 NZ_JAHWGH010000014.1 0 717625 green_a4
chr - seq7 NZ_JAHWGH010000015.1 0 209757 green_a4
chr - seq8 NZ_JAHWGH010000016.1 0 55318 green_a4
chr - seq9 NZ_JAHWGH010000017.1 0 467034 green_a4
chr - seq50 NZ_CAJGBF010000017.1 0 83173 green_a4
chr - seq51 NZ_CAJGBF010000018.1 0 76510 green_a4
chr - seq52 NZ_CAJGBF010000019.1 0 67820 green_a4
chr - seq54 NZ_CAJGBF010000021.1 0 61770 green_a4
chr - seq55 NZ_CAJGBF010000022.1 0 56876 green_a4
chr - seq56 NZ_CAJGBF010000023.1 0 50411 green_a4
chr - seq57 NZ_CAJGBF010000024.1 0 49535 green_a4

4番目の列の名前がNZ_JAHWGHで始まる場合は、行の3番目の列の名前をseq1に変更し、名前がNZ_CAJGBFで始まる場合はseq2に変更したいと思います。同じファイルから次のような出力を取得したいと思います。

chr - seq1 NZ_JAHWGH010000010.1 0 60562 green_a4
chr - seq1 NZ_JAHWGH010000012.1 0 466573 green_a4
chr - seq1 NZ_JAHWGH010000013.1 0 125526 green_a4
chr - seq1 NZ_JAHWGH010000014.1 0 717625 green_a4
chr - seq1 NZ_JAHWGH010000015.1 0 209757 green_a4
chr - seq1 NZ_JAHWGH010000016.1 0 55318 green_a4
chr - seq1 NZ_JAHWGH010000017.1 0 467034 green_a4
chr - seq2 NZ_CAJGBF010000017.1 0 83173 green_a4
chr - seq2 NZ_CAJGBF010000018.1 0 76510 green_a4
chr - seq2 NZ_CAJGBF010000019.1 0 67820 green_a4
chr - seq2 NZ_CAJGBF010000021.1 0 61770 green_a4
chr - seq2 NZ_CAJGBF010000022.1 0 56876 green_a4
chr - seq2 NZ_CAJGBF010000023.1 0 50411 green_a4
chr - seq2 NZ_CAJGBF010000024.1 0 49535 green_a4

次の2つのコマンドを試しましたが、動作しません。

awk 'BEGIN{FS=OFS=" "}($4 == /^NZ_JAHWGH/){$3==seq1}1' file.txt

awk 'BEGIN{FS=OFS=" "} {if ($4 ~ /^NZ_JAHWGH/) $3=seq1}1' file.txt

答え1

まずawk試してみてください。

awk 'BEGIN{FS=OFS=" "}($4 == /^NZ_JAHWGH/){$3==seq1}1' file.txt

$3==seq1テストは$3正確に次のようになるため失敗します。変える seq1。あなたが望むのは、値をテストする代わりに値を設定し、これが変数ではなく文字列であることを示すものではあり=ません。=="seq1"

次に、正規表現を確認するには代わりにが~ /regex/必要です== /regex/。同じ理由で2回目の試みが失敗しました。"seq1"文字列が必要ですが、==この方法では使用できません。また、両方ともFS基本的OFSに空白なので、BEGINブロックは必要ありません。これらすべてをまとめると、次のコマンド(試行するのと同じアイデア)が期待どおりに機能するはずです。

$ awk '($4 ~ /^NZ_JAHWGH/){$3="seq1"} ($4 ~ /^NZ_CAJGBF/){$3="seq2"}1' file.txt
chr - seq1 NZ_JAHWGH010000010.1 0 60562 green_a4
chr - seq1 NZ_JAHWGH010000012.1 0 466573 green_a4
chr - seq1 NZ_JAHWGH010000013.1 0 125526 green_a4
chr - seq1 NZ_JAHWGH010000014.1 0 717625 green_a4
chr - seq1 NZ_JAHWGH010000015.1 0 209757 green_a4
chr - seq1 NZ_JAHWGH010000016.1 0 55318 green_a4
chr - seq1 NZ_JAHWGH010000017.1 0 467034 green_a4
chr - seq2 NZ_CAJGBF010000017.1 0 83173 green_a4
chr - seq2 NZ_CAJGBF010000018.1 0 76510 green_a4
chr - seq2 NZ_CAJGBF010000019.1 0 67820 green_a4
chr - seq2 NZ_CAJGBF010000021.1 0 61770 green_a4
chr - seq2 NZ_CAJGBF010000022.1 0 56876 green_a4
chr - seq2 NZ_CAJGBF010000023.1 0 50411 green_a4
chr - seq2 NZ_CAJGBF010000024.1 0 49535 green_a4

答え2

どうですかsed

sed -e "s/seq.* NZ_JAHWGH/seq1 NZ_JAHWGH/" -e "s/seq.* NZ_CAJGBF/seq2 NZ_CAJGBF/" file.txt

関連情報