配列の列を切り取り、別の列を csv ファイルに結合します。

配列の列を切り取り、別の列を csv ファイルに結合します。

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 44番目の列を削除し、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)

関連情報