如何将csv文件中的最后一列交换为第一列?
我在考虑使用awk但不确定?
awk -F, '{print $1,$2}' filename
OR是sed
更好的选择吗?
答案 0 :(得分:3)
对于任意数量的列,您可以执行以下操作:
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
答案 1 :(得分:2)
使用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/'
答案 2 :(得分:2)
sed 's/\(.*\),\([^,]*\)/\2,\1/' YourFile
在这种情况下,sed完全符合。
来自@JID的优化使用没有结尾,
且基于组顺序行为的事实
sed 's/\(.*\),\(.*\)/\2,\1/' YourFile
答案 3 :(得分:1)
我选择合适的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
(这不包括包含换行符的字段)
答案 4 :(得分:1)
使用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