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

관련 정보