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

时间:2015-04-16 23:00:13

标签: bash awk sed

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

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

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

OR是sed更好的选择吗?

5 个答案:

答案 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