这样列出了4个列表。我需要根据first numerical column
对它们进行排序。列由tabs
/ \t
分隔。
France \t Paris \t 13.2 \t 14.2
Germany \t Munich \t Hamburg \t 16.9 \t 16.6
Norway \t 8.9 \t 9.1
Spain \t Barcelona \t Madrid \t Malaga \t 21.2 \t 19.4
排序后,这些列将显示为 - >
Norway \t 8.9 \t 9.1
France \t Paris \t 13.2 \t 14.2
Germany \t Munich \t Hamburg \t 16.9 \t 16.6
Spain \t Barcelona \t Madrid \t Malaga \t 21.2 \t 19.4
根据8.9, 13.2, 16.9 & 21.2
对其进行排序。
我尝试使用sort -k 2n
或sort -k 3n
之类的内容,根据第2列或第3列对列表进行排序。但是,8.9, 13.2, 16.9 & 21.2
位于第2,第3,第4和第2位。列表中的第5列。我怎么解决这个问题?
答案 0 :(得分:5)
这个怎么样:
sed -e 's/^[^0-9.]*\([0-9.]\+\).*$/\1\t\0/' input | sort -n | cut -f 2-
我们提取第一个数字字段,然后将其插入每行的开头。然后我们用数字排序所有行,然后我们删除我们在第一步中添加的东西。
答案 1 :(得分:2)
在Gnu awk:
$ awk '{a[$0]=$(NF-1)} END {PROCINFO["sorted_in"]="@val_num_asc"; for(i in a) print i}' tst
Norway 8.9 9.1
France Paris 13.2 14.2
Germany Munich Hamburg 16.9 16.6
Spain Barcelona Madrid Malaga 21.2 19.4
下行:它删除重复的行。
答案 2 :(得分:1)
为清楚起见,我已将\t
从输入文件中删除,解决方案不依赖于间距
$ cat ip.txt
France Paris 13.2 14.2
Germany Munich Hamburg 16.9 16.6
Norway 8.9 9.1
Spain Barcelona Madrid Malaga 21.2 19.4
$ perl -lne '($k)=/([\d.]+)/; $h{$k}=$_; END{print $h{$_} foreach (sort {$a <=> $b} keys %h)}' ip.txt
Norway 8.9 9.1
France Paris 13.2 14.2
Germany Munich Hamburg 16.9 16.6
Spain Barcelona Madrid Malaga 21.2 19.4
答案 3 :(得分:0)
这将基于倒数第二列进行排序,它将在每行的开头提取并添加倒数第二列,然后对其应用数字排序。然后将删除先前预先填写的列。这也适用于重复记录。
awk '{print $(NF-1),$0}' inputfile| sort -n | cut -f2- -d' '
Norway 8.9 9.1
France Paris 13.2 14.2
Germany Munich Hamburg 16.9 16.6
Spain Barcelona Madrid Malaga 21.2 19.4