如何将 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