如何将 csv 文件中的最后一列交换为第一列? + awk

How do I swap the last column in a csv file to be the first column? + awk

如何将 csv 文件中的最后一列交换为第一列?

我正在考虑使用 awk 但不确定?

awk -F, '{print ,}' filename

或者 sed 是更好的选择吗?

对于任意数量的列,您可以这样做:

awk 'BEGIN {OFS=FS=",";} {temp=$NF; $NF = ""; sub(",$", ""); print temp, [=10=]}' filename
  • OFS=FS="," 将输出和输入字段分隔符设置为逗号。
  • temp = $NF 将最后一列的原始内容保存在一个变量中。
  • $NF = '' 清空输入中的最后一列。
  • sub(",$", "") 去掉那个
  • 留下的多余逗号
  • print temp, [=16=] 打印保存的最后一列,然后是输入的其余部分。

如果您知道有多少列,使用 cut 可能更容易做到这一点。如果有9列,你可以这样做:

cut -d, -f9,1-8 infile > outfile

我会选择合适的 CSV 解析器。 Ruby自带一个

你想交换第一个和最后一个字段吗?
或者你想把最后一个字段移到前面?

如果是后者:

ruby -rcsv -ne '
  row = CSV.parse_line($_.chomp!)
  row.unshift(row.pop)
  # to exchange first and last fields: row[0],row[-1] = row[-1],row[0]
  puts CSV.generate_line(row)
' <<END
a,b,c
d,e,f
g,h,"""Just drive,"" she said"
END
c,a,b
f,d,e
"""Just drive,"" she said",g,h

(这不考虑包含换行符的字段)

使用 GNU awk 和其他一些工具,您只需要:

$ echo 'a,b,c' | awk 'BEGIN{FS=OFS=","} {[=10=]=$NF FS [=10=]; NF--} 1'
c,a,b

否则这将适用于任何 awk:

$ echo 'a,b,c' | awk 'BEGIN{FS=OFS=","} {[=11=]=$NF FS [=11=]; sub(/,[^,]*$/,"")} 1'
c,a,b

使用 gawk 和 gensub

awk '[=10=]=gensub(/(.*),(.*)/,"\2,\1","1")'

输入

1,2,3,4,5,6
a,b,c,d,e,f

输出

6,1,2,3,4,5
f,a,b,c,d,e

如果你想切换它们

awk '[=13=]=gensub(/([^,]+),(.*),(.*)/,"\3,\2,\1","1")'

输入

1,2,3,4,5,6
a,b,c,d,e,f

输出

6,2,3,4,5,1
f,b,c,d,e,a

sed 中相同

sed -r 's/([^,]+),(.*),(.*)/,,/'
sed 's/\(.*\),\([^,]*\)/,/' YourFile

在这种情况下,sed 完全兼容。

来自@JID 的优化使用没有结尾的事实 , 并基于组订单的行为

sed 's/\(.*\),\(.*\)/,/' YourFile