awkコマンドが列2で機能するようにどのように指示できますか?

awkコマンドが列2で機能するようにどのように指示できますか?

awkこのコマンドを使用して、列2の最後の下線をタブに置き換えたいと思います。各行の最後の下線がタブ文字に置き換えられます。各行列の下線の数が異なる可能性があることに注意してください。私はコマンドが列2でのみ動作するように指示するためにいくつかの方法を試しました。かなり近づいていますが、最終調整をしてくれる人がいますか?

タブ区切りのサンプルファイル:

OTU1 this_is_the_second_column 100 0 450 this_is_the_sixth_column 1 5 3.2
OTU2 this_is_another_column_to_parse 103 4 650 this_is_another_test_string_too 4 7 4.6

次のようにする必要があります。

OTU1 this_is_the_second column 100 0 450 this_is_the_sixth_column 1 5 3.2
OTU2 this_is_another_column_to parse 103 4 650 this_is_another_test_string_too 4 7 4.6

これは私の現在のコードです。

gawk -F'\t' -v OFS='\t' 'BEGIN{FS=OFS="_"}{last=$NF;NF--;print $0"\t"last}' test1.tab > test1_reformat.tab

どんな助けでも大変感謝します。

ありがとう

ベストアンサー1

GNU awkがあるようですので、これを使うことができます。この関数は、アンダースコアの後のアンダースコアではなく、末尾のシーケンスをキャプチャし、タブの後ろで再び置き換えます。

gawk 'BEGIN {OFS=FS="\t"} {$2 = gensub(/_([^_]*)$/, "\t\\1", "1", $2)} 1' test1.tab

または(私の考えでは移植可能)、このmatch関数を使用して文字列分割を実行できます。

awk 'BEGIN{OFS=FS="\t"} match($2,/_[^_]*$/) {$2 = substr($2,1,RSTART-1) "\t" substr($2,RSTART+1)} 1' test1.tab

おすすめ記事