![csv 中的逆序](https://linux22.com/image/100578/csv%20%E4%B8%AD%E7%9A%84%E9%80%86%E5%BA%8F.png)
我有一个 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 解析器的 shell 调用:
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