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 -d, -f9,1-8 infile > outfile
在这种情况下,SED完全合规。
使用@JID的优化使用了一个事实,即没有结局sed 's/\(.*\),\([^,]*\)/\2,\1/' YourFile
,并且基于组顺序的行为
sed 's/\(.*\),\(.*\)/\2,\1/' YourFile
输入
awk '$0=gensub(/(.*),(.*)/,"\\2,\\1","1")'
输出
如果您想切换它们
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
您想交换第一个和最后一个字段吗?
如果后者:
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
(这不考虑包含新线的字段)
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