次の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
の場合、perl
CSVのフィールドにカンマ、改行などが含まれていないとします。
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