2010-08-05 21 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