我有一个假设的清单:
C1
C2
H3
H4
O5
并且,我想通过引入特定订单对其进行排序,按行号排序,请说:
5
3
1
2
4
输出结果为:
O5
H3
C1
C2
H4
我的第一次尝试是在bash中使用sort命令。
答案 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