如何按给定和特定的顺序对列表进行排序?

时间:2017-07-11 01:39:47

标签: bash sorting awk sed grep

我有一个假设的清单:

C1
C2
H3
H4
O5

并且,我想通过引入特定订单对其进行排序,按行号排序,请说:

5
3
1
2
4

输出结果为:

O5
H3
C1
C2
H4

我的第一次尝试是在bash中使用sort命令。

  • 这是awk,sed还是grep?

3 个答案:

答案 0 :(得分:2)

这是一个awk解决方案,

$ cat > list
C1
C2
H3
H4
O5
$ cat > order
5
3
1
2
4
$ awk 'NR==FNR{a[FNR]=$1;next} {print a[$1]}' list order
O5
H3
C1
C2
H4

简要说明,

  • NR==FNR{a[FNR]=$1;next}:将列表中每条记录的$1设置为数组元素a[FNR]
  • print a[$1]:对于$1文件中每条记录中的order,请打印相应的a[$1]。在这种情况下,订单将被保留。

答案 1 :(得分:1)

$ cat >list
C1
C2
H3
H4
O5
$ cat >order
5
3
1
2
4


 join -j 1 <(paste order <(seq 1 5)|sort -n) <(paste <(seq 1 5) list)|sort -n -k2|cut -d' ' -f3

答案 2 :(得分:1)

如果列表不是很大,这就是perl很容易做到的事情  并迅速:

$ cat > list
C1
C2
H3
H4
O5
$ cat > order
5
3
1
2
4
$ perl -e 'open(F,"order")||die;while(<F>){$m{$_}=$n++};\
  print sort{$m{substr($a,1)}<=>$m{substr($b,1)}} <>' < list
O5
H3
C1
C2
H4