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



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

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

awk -F, '{print $1,$2}' filename

或者sed是更好的选择?

对于任意数量的列,您可以执行以下操作:

awk 'BEGIN {OFS=FS=",";} {temp=$NF; $NF = ""; sub(",$", ""); print temp, $0}' filename
  • OFS=FS=","将输出和输入字段分隔符设置为逗号。
  • temp = $NF将最后一列的原始内容保存在变量中。
  • $NF = ''清空输入中的最后一列。
  • sub(",$", "")摆脱了留下的额外逗号
  • print temp, $0打印保存的最后一列,后跟其余的输入。

如果您知道有多少列,则使用 cut 执行此操作可能更容易。如果有 9 列,您可以执行以下操作:

cut -d, -f9,1-8 infile > outfile
sed 's/(.*),([^,]*)/2,1/' YourFile

在这种情况下,sed 是完全合规的。

利用

没有结束,的事实和基于组顺序行为的@JID优化

sed 's/(.*),(.*)/2,1/' YourFile

使用 gawk 和 gensub

awk '$0=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 '$0=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/([^,]+),(.*),(.*)/3,2,1/'

我会使用适当的CSV解析器。红宝石附带一个

是否要交换第一个和最后一个字段?
还是要将最后一个字段移到前面?

如果后者:

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=","} {$0=$NF FS $0; NF--} 1'
c,a,b

否则,这将适用于任何 awk:

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

最新更新