CSVの逆順

CSVの逆順

次のCSVファイルがあります。

input.csv
1,2,3,10
4,5,6
7,8,9,12,28,30

このファイルの列を逆にしたいと思います。これは次のことを意味します。

output.csv
10,3,2,1
6,5,4
30,28,12,9,8,7

固定数の列を処理する方法を知っていますが、列数が変更されたらどうなりますか?

答え1

の場合、perlCSVのフィールドにカンマ、改行などが含まれていないとします。

perl -lpe '$_ = join ",", reverse split /,/' input.csv

答え2

フィールド自体には時々カンマや改行がある可能性があるため、単に行で分割してからカンマでCSVを処理することはできません。これらの文字を含めるには、フィールドを引用符で囲む必要があります。

以下は、正しいcsvパーサーを使用してシェルから呼び出すことができる簡単なソリューションです。

ruby -r csv -e 'CSV.filter(&:reverse!)' input.csv

Rubyがなければ、Python 2と3で動作します。

python -c $'import csv; import sys\nfor r in csv.reader(sys.stdin): r.reverse(); csv.writer(sys.stdout).writerow(r)' < input.csv > output.csv

これは複数行です。

python < input.csv > output.csv -c '
import csv
import sys

for r in csv.reader(sys.stdin):
  r.reverse()
  csv.writer(sys.stdout).writerow(r)
'

これはこれがうまくいき、単純なカンマ区切りの解決策がうまくいかないいくつかの例です。

入力.csv

1,"2,3"

出力.csv

"2,3",1

入力.csv

1,"
2"

出力.csv

"
2",1

答え3

あなたが使用できるawk

awk  'BEGIN{
  FS=OFS=","                       # set the field delimiter
}
{                                  # execute only on non empty line
  for(i=NF;i>=1;i--)               # loop through all elements
    printf "%s", $i (i==1?ORS:OFS) # print the parameter together with the comma or newline 
}' input.csv

答え4

perl -l -a -F, -n -e 'print join ("," , reverse  @F)'  input.csv

関連情報