2012-01-26 7 views
20

Mam plik tak (która jest oddzielona spacjami):jak używać polecenia Linux Sortowanie pliku tekstowego zgodnie z 4. kolumną, kolejność numeryczna?

AX-18 Chr1_419085 1 41908545 T C -1 98 0.51 
AX-19 Chr1_419087 1 41908740 T C 0 15 0.067 
AX-20 Chr1_419087 1 41908741 T C 0 13 0.067 

i chcę użyć polecenia sort aby posortować pliki według 4 kolumny. Sprawdziłem to wszędzie w Internecie i znajduję różne rozwiązania, które zakonnice działają! Mam nawet podobne pytanie w stackoverflow, którego odpowiedź mi nie pasuje! więc są to polecenia, których używam i nie działają!

sort -n -k 4,1 out1.txt 
sort -n -k 4 out1.txt 
sort -n -k4 out1.txt 
sort -nk4 out1.txt 
sort +4 out1.txt 

więc po uruchomieniu wszystkie te polecenia otrzymuję ten wyjścia (który jest identyczny z moim wejściem):

AX-18 Chr1_419085 1 41908545 T C -1 98 0.51 
AX-19 Chr1_419087 1 41908740 T C 0 15 0.067 
AX-20 Chr1_419087 1 41908741 T C 0 13 0.067 

chcę uzyskać wyjście takiego:

AX-19 Chr1_419087 1 41908741 T C 0 15 0.067 
AX-20 Chr1_419087 1 41908740 T C 0 13 0.067 
AX-18 Chr1_419085 1 41908545 T C -1 98 0.51 
+1

jeśli chcesz więcej pomocy, proponuję Ci określić, co się dzieje i co można oczekiwać zamiast – sehe

+0

41908545 to mniej niż 41908741. Chcesz posortować numery ich najmniej znaczących cyfr ? – Joni

+1

Czy możesz wyjaśnić, która zasada powoduje preferowaną kolejność "41908740", "41908741", "41908545"? Wydaje się, że jest dla nich ** ** **. – wallyk

Odpowiedz

34
sort -nk4 file 

-n for numerical sort 
-k for providing key 

lub dodać -r option na odwrotnej sortowania

sort -nrk4 file 
1

It powinien być

sort -k 4n out1.txt 

Jus t przetestowane GNU sortowania (--debug włączony):

$ tac input | /bin/sort --debug -k 4n 
/bin/sort: using simple byte comparison 
/bin/sort: key 1 is numeric and spans multiple fields 
AX-18 Chr1_419085 1 41908545 T C -1 98 0.51 
        ________ 
___________________________________________ 
AX-19 Chr1_419087 1 41908740 T C 0 15 0.067 
        ________ 
___________________________________________ 
AX-20 Chr1_419087 1 41908741 T C 0 13 0.067 
        ________ 
___________________________________________ 
+0

nie, to też nie działa! – mahmood

6

sort nie sortowania pliku w miejscu. Zamiast tego wysyła posortowaną kopię.

Potrzebujesz sort -n -k 4 out.txt > sorted-out.txt.

Edit: Aby uzyskać żądanej kolejności trzeba uporządkować plik z numerami czytanych w odwrotnej. To prawda:

cut -d' ' -f4 out.txt | rev | paste - out.txt | sort -k1 -n | cut -f2- > sorted-out.txt

+0

To też nie działa! – mahmood

+0

Ale twoje dane nie mają 41908745. Ma 41908545. – Joni

0

Pomocne jest wspomnieć, że jeśli słowa w każdym wierszu pliku są oddzielone przez separator z wyjątkiem „przestrzeni”, to możemy określić separator za pomocą opcji „-t”:

sort -n -t',' -k4 file -o outfile 

Możemy uzyskać posortowane dane wyjściowe w dowolnym określonym pliku wyjściowym (przy użyciu opcji "-o") zamiast wyświetlać dane wyjściowe na standardowym wyjściu.

źródło: http://www.thegeekstuff.com/2013/04/sort-files/

Powiązane problemy