区切りファイルを変換するにはシェルコマンドが必要です。入力ファイルは二重引用符と二重引用符のない2つのバリエーションで受信され、両方のファイルは区切り文字でコンマがありました。要件は、カンマをTABに置き換えて引用符を削除することです(ファイルに二重引用符がある場合)。それ以外の場合は、カンマを変更するだけです。ファイルフィールドに変換中に無視する必要があるカンマも含まれている場合、ファイルは引用符で送信されます。 単一のコマンドは、RHEL 6.x環境のAwk 3.xで動作する必要があります。
例えば。二重引用符付きファイル1:
"Jhon","Carpenter","CA,TX,NJ"
"Mike","Painter","WA,GA,MI"
変換後はタブで区切る必要があります。
Jhon Carpenter CA,TX,NJ
Mike Painter WA,GA,MI
例えば。二重引用符のないファイル 2:
EMP1,123456,CA
EMP2,456789,TX
変換後はタブで区切る必要があります。
EMP1 123456 CA
EMP2 456789 TX
答え1
使用csvkit
:
$ csvformat -T file1.csv
Jhon Carpenter CA,TX,NJ
Mike Painter WA,GA,MI
$ csvformat -T file2.csv
EMP1 123456 CA
EMP2 456789 TX
出力がfile1.csv
少し間違っているように見えますが、これはタブが正しく整列していないためです。すべての列の間にタブがあります。
CSVKitは、さまざまなCSV関連のシェルユーティリティを含むPythonベースのツールキットです。正しいCSV解析を実行し、CSVファイルをクエリ、フォーマット、変換するために使用できます。
たとえば、最初のファイルに正しいヘッダーがある場合は、それをJSONに変換するのは簡単です。
$ csvjson file1.csv
[{"First": "Jhon", "Last": "Carpenter", "Stuff": "CA,TX,NJ"}, {"First": "Mike", "Last": "Painter", "Stuff": "WA,GA,MI"}]
答え2
この短いsed
スクリプトは両方のタイプのファイルを処理できます(最初のタイプと2番目のタイプを含む混合ファイルも含みます)。
sed '/"/!s/,/\t/g;s/","/\t/g; s/"//g'
繰り返されない式をグループ化しないので、スクリプトよりはるかに高速です。
sed
GNUがあるのでうまくいくようです\t
。それ以外の場合は、代わりにリテラルTABを使用してください。
答え3
いくつかの方法:
(二重引用符を使用file1
):
-アッ方法:
awk -F'"' '{ r=""; for(i=1;i<NF;i++)
if ($i~/^[[:alnum:]]/) r=(r!="")? r OFS $i : $i; print r }' OFS='\t' file1
-sed方法:
sed 's/","/\t/g; s/"//g;' file1
出力(両方の方法):
Jhon Carpenter CA,TX,NJ
Mike Painter WA,GA,MI
----------
(file2
二重引用符を除く) -tr
次のコマンドを適用すれば十分です。
tr ',' '\t' <file2
出力:
EMP1 123456 CA
EMP2 456789 TX
----------
条件への統一されたアプローチ」両方のファイル形式に対して同じコマンドで十分でなければなりません。":
awk -v quoted=$(grep -cm1 '"' file1) 'BEGIN{ FS=(quoted)? "\"" : ","; }
{ r=""; for(i=1;i<=NF;i++) if(!quoted || $i~/^[[:alnum:]]/) r=(r!="")? r OFS $i : $i;
print r }' OFS='\t' file1
答え4
CSVデータには適切なCSVパーサが必要です。私は Kusarananda の答えが好きです。 csvモジュールと一緒にRubyなどの言語を使用することもできます。
ruby -rcsv -e '
out = CSV.new($stdout, {:col_sep => "\t"})
CSV.foreach(ARGV.shift) {|row| out << row}
' file1.csv