Это будет работать с использованием любого awk, сортировки и вырезания в любой оболочке на каждом поле UNIX и будет работать независимо от того, поступает ли ввод из канала (когда вы не можете прочитать его дважды) или из файла (когда вы можете) и не включает в себя awk, порождающий подоболочку:
awk -v OFS='\t' '{print (NR>1), $0}' file | sort -k1,1n -k2,2 | cut -f2-
В приведенном выше примере awk используется для обозначения 0 в начале строки заголовка и 1 перед остальными, чтобы вы могли отсортировать по это число, затем любые другие поля, которые вы хотите отсортировать, а затем снова удалите добавленное поле с вырезом. Вот оно поэтапно:
$ awk -v OFS='\t' '{print (NR>1), $0}' file
0 Gene Number
1 a 3
1 u 7
1 b 9
$ awk -v OFS='\t' '{print (NR>1), $0}' file | sort -k1,1n -k2,2
0 Gene Number
1 a 3
1 b 9
1 u 7
$ awk -v OFS='\t' '{print (NR>1), $0}' file | sort -k1,1n -k2,2 | cut -f2-
Gene Number
a 3
b 9
u 7