2017-03-02 5 views
1

以下はサンプルデータです。この操作は、何百万というレコードがあるファイルに対して実行する必要があるため、最適な方法が必要です。本質的には、第2列を、第4列の最初の2文字を連結し、第2列の最初の3つのフィールド( '_'区切り)を除いて更新することを検討しています。awkを使用して複数の区切り文字を持つcsvファイルを変換する方法

私は非常に時間がかかる行を1行ずつ読み書きすることを試みています。

234234234,123_33_3_11111_asdf_asadfas,01,06_1234,4325325432,2 
234234234,123_11_2_234111_aadsvfcvxf_anfews,01,07_4444,423425432,2 
234234234,123_33_3_11111_mlkvffdg_mlkfgufks,01,08_2342,436876532,2 
234234234,123_33_3_11111_qewf_mkhsdf,01,09_68645,43234532,2 

出力として必要とされています:私は

awk -F, '{print $1","substr($4,1,2)"_"cut -f4-6 -d'_'($2)","$3","$4","$5","$6}' 

入力データのようなawkの何かと何かが必要

234234234,06_11111_asdf_asadfas,01,06_1234,4325325432,2 
234234234,07_234111_aadsvfcvxf_anfews,01,07_4444,423425432,2 
234234234,08_11111_mlkvffdg_mlkfgufks,01,08_2342,436876532,2 
234234234,09_11111_qewf_mkhsdf,01,09_68645,43234532,2 
+0

あなたはあなたの試みと何が間違っているかの詳細を編集してください。コメントセクションはそのような情報の適切な場所ではありません。 –

+0

また、 'awk'がPythonのようなスクリプト化されたソリューションと比べて特に効率的になるのでしょうか? –

+0

私はこのデータを変換する必要があるサーバーにPythonを持っていないので、awkが好きです。この変換が必要な最大のファイルは75Gbです。 –

答えて

2

あなたはラインの再整形のためのawkとprintfを使用することができます

awk -F"[,_]" '{ 
    printf "%s,%s_%s_%s_%s,%s,%s_%s,%s,%s\n", $1,$9,$5,$6,$7,$8,$9,$10,$11,$12 
}' file 

あなたは、

 
234234234,06_11111_asdf_asadfas,01,06_1234,4325325432,2 
234234234,07_234111_aadsvfcvxf_anfews,01,07_4444,423425432,2 
234234234,08_11111_mlkvffdg_mlkfgufks,01,08_2342,436876532,2 
234234234,09_11111_qewf_mkhsdf,01,09_68645,43234532,2 
+1

ありがとうございます!それは完全に動作します! –

+0

**一般** CSVファイルでは動作しません。たとえば、フィールド自体にCSV形式のカンマが含まれている場合は、これを引用符で囲むことで記述することができます(つまり、 '....、abc、def"、... ')、awkプログラムも分割されますこのコンマ。ところで、あなたの投稿のタイトルは誤解を招きます:複数の区切り記号はなく、1つだけ(カンマ)。実際、複数の区切り文字がある場合、これはもはやCSV形式とはみなされません。 – user1934428

+0

@ user1934428 'xml'、' json'、 'html'、' csv'などの書式に同意します。私はパーサー用の特別なツールを使うことをお勧めします –

関連する問題