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

问题描述 投票:0回答:4
如何将CSV文件中的最后一列交换为第一列? 我正在考虑使用尴尬,但不确定吗?

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

或一个更好的选择?

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

sed
bash awk sed
4个回答
3
投票

awk 'BEGIN {OFS=FS=",";} {temp=$NF; $NF = ""; sub(",$", ""); print temp, $0}' filename
将输出和输入场分离器设置为逗号。
    OFS=FS=","
  • 将最后一列的原始内容保存在变量中。
    temp = $NF
  • 倒入输入中的最后一列。
  • $NF = ''
    摆脱那个留下的额外逗号
  • sub(",$", "")
    打印了保存的最后一列,然后打印输入的其余部分。
    
  • 如果您知道有多少列,如果我们可以这样做,那就太好了:
  • print temp, $0
  • 但是它不起作用,因此请参阅使用切割
  • cartrange列的原因。
    
    
  • cut -d, -f9,1-8 infile > outfile

在这种情况下,SED完全合规。

使用@JID的优化使用了一个事实,即没有结局
sed 's/\(.*\),\([^,]*\)/\2,\1/' YourFile
,并且基于组顺序的行为

,


3
投票
使用Gawk和Gensub
sed 's/\(.*\),\(.*\)/\2,\1/' YourFile

输入

awk '$0=gensub(/(.*),(.*)/,"\\2,\\1","1")'

输出

2
投票

如果您想切换它们
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

在sed

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

我会选择一个适当的CSV解析器。 Ruby带有One
您想交换第一个和最后一个字段吗?

还是您想将最后一个字段移到前面?

如果后者:

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

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
(这不考虑包含新线的字段)

1
投票

gnu Awk和其他您需要的其他所有内容是:


c,a,b f,d,e """Just drive,"" she said",g,h

,否则这将适合任何尴尬:

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.