如何将 csv 文件中的最后一列交换为第一列? + awk
How do I swap the last column in a csv file to be the first column? + awk
如何将 csv 文件中的最后一列交换为第一列?
我正在考虑使用 awk 但不确定?
awk -F, '{print ,}' filename
或者 sed
是更好的选择吗?
对于任意数量的列,您可以这样做:
awk 'BEGIN {OFS=FS=",";} {temp=$NF; $NF = ""; sub(",$", ""); print temp, [=10=]}' filename
OFS=FS=","
将输出和输入字段分隔符设置为逗号。
temp = $NF
将最后一列的原始内容保存在一个变量中。
$NF = ''
清空输入中的最后一列。
sub(",$", "")
去掉那个 留下的多余逗号
print temp, [=16=]
打印保存的最后一列,然后是输入的其余部分。
如果您知道有多少列,使用 cut
可能更容易做到这一点。如果有9列,你可以这样做:
cut -d, -f9,1-8 infile > outfile
我会选择合适的 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
(这不考虑包含换行符的字段)
使用 GNU awk 和其他一些工具,您只需要:
$ echo 'a,b,c' | awk 'BEGIN{FS=OFS=","} {[=10=]=$NF FS [=10=]; NF--} 1'
c,a,b
否则这将适用于任何 awk:
$ echo 'a,b,c' | awk 'BEGIN{FS=OFS=","} {[=11=]=$NF FS [=11=]; sub(/,[^,]*$/,"")} 1'
c,a,b
使用 gawk 和 gensub
awk '[=10=]=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 '[=13=]=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/([^,]+),(.*),(.*)/,,/'
sed 's/\(.*\),\([^,]*\)/,/' YourFile
在这种情况下,sed 完全兼容。
来自@JID 的优化使用没有结尾的事实 ,
并基于组订单的行为
sed 's/\(.*\),\(.*\)/,/' YourFile
如何将 csv 文件中的最后一列交换为第一列?
我正在考虑使用 awk 但不确定?
awk -F, '{print ,}' filename
或者 sed
是更好的选择吗?
对于任意数量的列,您可以这样做:
awk 'BEGIN {OFS=FS=",";} {temp=$NF; $NF = ""; sub(",$", ""); print temp, [=10=]}' filename
OFS=FS=","
将输出和输入字段分隔符设置为逗号。temp = $NF
将最后一列的原始内容保存在一个变量中。$NF = ''
清空输入中的最后一列。sub(",$", "")
去掉那个 留下的多余逗号
print temp, [=16=]
打印保存的最后一列,然后是输入的其余部分。
如果您知道有多少列,使用 cut
可能更容易做到这一点。如果有9列,你可以这样做:
cut -d, -f9,1-8 infile > outfile
我会选择合适的 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
(这不考虑包含换行符的字段)
使用 GNU awk 和其他一些工具,您只需要:
$ echo 'a,b,c' | awk 'BEGIN{FS=OFS=","} {[=10=]=$NF FS [=10=]; NF--} 1'
c,a,b
否则这将适用于任何 awk:
$ echo 'a,b,c' | awk 'BEGIN{FS=OFS=","} {[=11=]=$NF FS [=11=]; sub(/,[^,]*$/,"")} 1'
c,a,b
使用 gawk 和 gensub
awk '[=10=]=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 '[=13=]=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/([^,]+),(.*),(.*)/,,/'
sed 's/\(.*\),\([^,]*\)/,/' YourFile
在这种情况下,sed 完全兼容。
来自@JID 的优化使用没有结尾的事实 ,
并基于组订单的行为
sed 's/\(.*\),\(.*\)/,/' YourFile