
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
しかし、上記のコマンドはエラーを出した
区切り文字は1文字でなければなりません
また、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列目の1列目を印刷して削除します
print a[1] substr(a[3],2)