2010-08-05 16 views
2

Unix的cut命令接受字段列表,但不是为了我需要进去。Unix的切割命令采取无序列表作为参数

$ echo 1,2,3,4,5,6 | cut -d, -f 1,2,3,5 
1,2,3,5 

$ echo 1,2,3,4,5,6 | cut -d, -f 1,3,2,5 
1,2,3,5 

不过,我想在Unix shell命令即会请按照我指定的顺序向我提供字段

回答

3

用途:

pax> echo 1,2,3,4,5,6 | awk -F, 'BEGIN {OFS=","}{print $1,$3,$2,$5}' 
1,3,2,5 

或:

pax> echo 1,2,3,4,5,6 | awk -F, -vOFS=, '{print $1,$3,$2,$5}' 
1,3,2,5 
0

基于awk中的解决方案是优雅。这是一个基于Perl的解决方案:

echo 1,2,3,4,5,6 | perl -e '@order=(1,3,2,5);@a=split/,/,<>;for(@order){print $a[$_-1];}' 
+0

与后来的Perl中,有-F选项:) – ghostdog74 2010-08-05 06:14:43

2

或者只是使用外壳

$ set -f 
$ string="1,2,3,4,5" 
$ IFS="," 
$ set -- $string 
$ echo $1 $3 $2 $5 
1 3 2 5 
+0

+1,很整齐.. – codaddict 2010-08-05 06:05:56

+1

@ ghostdog74:您需要首先执行'set -f'',否则如果字符串包含'*'或'?'或'['',则会发生匹配。即使如此,一些炮弹可能会解释'\\';我不确定POSIX对此有何评论,而且壳牌作者似乎在这个问题上存在分歧。 – Gilles 2010-08-05 19:12:00