다음과 같은 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