CSVファイルがあります
input.csv
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
上記のCSVファイルから配列列を削除して出力を取得する必要があります。
output.csv
1,2,3,9,12
1,2,3,9,12
1,2,3,9,12
だから私は努力しました
cut -d , -f4 -- complement input.csv > output.csv
しかし、上記のコマンドはエラーを提供します
区切り文字は単一文字でなければなりません。
また、output.csvを他のCSVファイルと結合したいと思います。
column.csv
30
36
90
それから結果はこれです
result.csv
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90
誰でも私を助けることができますか?
答え1
ミラー(http://johnkerl.org/miller/doc)から始める
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
とても簡単です。実行できます。
mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 4 input.csv | paste -d , - column.csv
得る
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90
cut -x -f 4
4番目の列を削除し、column.csvpaste
列を追加しました。
答え2
引用符で囲まれた区切り文字を正しく処理するには、特別に設計されたCSVパーサー(perl Text :: CSVモジュールのパーサーなど)の使用を検討する必要があります。例えば、
paste -d, input.csv column.csv | perl -MText::CSV -ne '
BEGIN {$csv = Text::CSV->new()}
if ($csv->parse($_)) {
@a = $csv->fields();
splice(@a, 3, 1);
print join(",", @a) . "\n";
}'
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90
答え3
@steeldriveが提案した特別に設計されたCSVパーサーを使用したくない場合は、次のものを使用できますawk
。
awk '{split($0,a,"\""); print a[1] substr(a[3],2)}' input.csv > output.csv
これは、例で提供されているスタイルでのみ機能します。
説明する:
テキストスペースの分割"
{split($0,a,"\"")
,
2番目の列の最初の列を印刷して削除します。
print a[1] substr(a[3],2)