「sed」を使用してTSVファイルのフィールドの末尾にテキストを挿入する

「sed」を使用してTSVファイルのフィールドの末尾にテキストを挿入する

sedワイルドカード式を含むコマンドを使用してTSVファイルに文字を挿入したいと思います。

次のファイルがあります。

Marker  Pvalue  Trait   Chr Pos
S3_16887238 6.172847e-09    Total_Soil_S    3   16887238
S3_16887238 6.172847e-09    Total_Soil_Pa   3   16887238
S3_16887238 6.172847e-09    Total_Soil_Cl   3   16887238

_All3番目の列のすべてのテキストの末尾に次の内容を追加したいと思います。

Marker  Pvalue  Trait   Chr Pos
S3_16887238 6.172847e-09    Total_Soil_S_All    3   16887238
S3_16887238 6.172847e-09    Total_Soil_Pa_All   3   16887238
S3_16887238 6.172847e-09    Total_Soil_Cl_All   3   16887238

このコマンドを使用していますが、動作しません。

sed -i 's/Total_Soil_\(.*\)/&_\1_All/g' top1.txt

Sこれはサンプルファイルなので、およびをPa置き換えることができますCl

ベストアンサー1

sed変更したいデータから正確な場所を見つけるのは難しいので、表形式のデータを使用しないことをお勧めします。このsedユーティリティは、テキストなどの非構造化データを処理するのに適しています。


使用ミラーmlr;構造化データ操作用に特別に設計されたツール)は、_All各TSVレコードフィールドのデータの末尾に文字列を追加します。Trait

$ mlr --tsv put '$Trait .= "_All"' file
Marker  Pvalue  Trait   Chr     Pos
S3_16887238     6.172847e-09    Total_Soil_S_All        3       16887238
S3_16887238     6.172847e-09    Total_Soil_Pa_All       3       16887238
S3_16887238     6.172847e-09    Total_Soil_Cl_All       3       16887238

mlrオプションと組み合わせて-I変更を適用します。

Total_Soilフィールドが文字列で始まる場合にのみ変更するようにしてから、次を使用する必要がありますか?

mlr --tsv put '$Trait =~ "^Total_Soil" { $Trait .= "_All" }' file

以下を使用して、各レコードのタブで区切られた3番目のフィールドのデータの末尾にawk文字列を追加します。_All

$ awk -F '\t' 'BEGIN { OFS=FS } NR > 1 { $3 = $3 "_All" }; 1' file
Marker  Pvalue  Trait       Chr     Pos
S3_16887238     6.172847e-09    Total_Soil_S_All        3       16887238
S3_16887238     6.172847e-09    Total_Soil_Pa_All       3       16887238
S3_16887238     6.172847e-09    Total_Soil_Cl_All       3       16887238

1コードの末尾を後続すると、変更されawkたレコードが無条件に出力されます。どうやって見ると書くの短縮形だ{ print }。ヘッダーの変更を明示的に防ぐ必要があることに注意してください。NR > 1テストが次のように評価されると、フィールドの使用と修正のみがテストされます。本物NR現在のレコードのシリアル番号です。)

出力を新しいファイルにリダイレクトし、新しいファイルの名前を元の名前に変更します。またはGNUを使用している場合は、指示に従い、以下を使用してくださいawk-i inplaceもう一つの質問+答えです。

同様に、文字列で始まる3番目のフィールドのみを変更するには、Total_Soil次のようにします。

awk -F '\t' 'BEGIN { OFS=FS } NR > 1 && $3 ~ /^Total_Soil/ { $3 = $3 "_All" }; 1' file

Perl の使用は次のようにほぼ同じですawk

$ perl -F'\t' -e 'BEGIN { $" = "\t" } if ($. > 1) { $F[2] .= "_All" } print "@F"' file
Marker  Pvalue  Trait   Chr     Pos
S3_16887238     6.172847e-09    Total_Soil_S_All        3       16887238
S3_16887238     6.172847e-09    Total_Soil_Pa_All       3       16887238
S3_16887238     6.172847e-09    Total_Soil_Cl_All       3       16887238

Total_Soilデータのみを変更してください。

perl -F'\t' -e 'BEGIN { $" = "\t" } if ($. > 1 && $F[2] =~ /^Total_Soil/) { $F[2] .= "_All" } print "@F"' file

おすすめ記事