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

对于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

相关内容