Bash ::如何根据文件的第一个数字列进行排序?

时间:2016-09-20 08:10:23

标签: bash shell sorting

这样列出了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 2nsort -k 3n之类的内容,根据第2列或第3列对列表进行排序。但是,8.9, 13.2, 16.9 & 21.2位于第2,第3,第4和第2位。列表中的第5列。我怎么解决这个问题?

4 个答案:

答案 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