Mam dane w następującym formacie:
foo<tab>1.00<space>1.33<space>2.00<tab>3
Teraz próbowałem posortować plik w oparciu o ostatnie pole malejąco. Próbowałem następujących poleceń, ale nie zostały posortowane zgodnie z oczekiwaniami.
$ sort -k3nr file.txt # apparently this sort by space as delimiter
$ sort -t"\t" -k3nr file.txt
sort: multi-character tab `\\t'
$ sort -t "`/bin/echo '\t'`" -k3,3nr file.txt
sort: multi-character tab `\\t'
Jak to zrobić?
Oto przykładowe dane .
linux
unix
sorting
tab-delimited
Neversaint
źródło
źródło
'"'"'
aby użyć go w aliasie.awk '{print $0 | "sort -nr" > "outfile" }' datafile
, z wyjątkiem delimitu tabulatora, który jest wysyłany do polecenia sortowania.Domyślnie ogranicznik pola nie jest przejściem pustym do pustego przejścia, więc karta powinna działać dobrze.
Jednak kolumny są indeksowane jako podstawa 1 i podstawa 0, więc prawdopodobnie chcesz
posortować plik.txt według kolumny 4 numerycznie w odwrotnej kolejności. (Chociaż dane w pytaniu mają nawet 5 pól, więc ostatnim polem będzie indeks 5.)
źródło
Musisz wstawić rzeczywisty znak tabulacji po -t \ i aby to zrobić w powłoce, naciśnij ctrl-v, a następnie znak tabulacji. Większość używanych przeze mnie powłok obsługuje ten tryb dosłownego wpisywania tabulatorów.
Uważaj jednak, ponieważ kopiowanie i wklejanie z innego miejsca zazwyczaj nie zachowuje zakładek.
źródło
C-q <tab>
na przykład. Myślę, że to też jest^V
w nano.Rozwiązanie $ nie działało dla mnie. Jednak przez umieszczenie samego znaku tabulacji w poleceniu: sort -t '' -k2
źródło
<C-v><Tab>
do wstawiania tabulacji w przypadku użycia klawisza tab do automatycznego uzupełniania w powłoce.$'\t'
działa w ksh, zsh i bash. Powłoka Bourne'a nie obsługuje tego. Zobacz ten post: unix.stackexchange.com/a/371873/201820przepuść to przez coś takiego
awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'
. Spowoduje to zmianę spacji na tabulatory.źródło
Zasadniczo przechowywanie takich danych nie jest dobrym rozwiązaniem, jeśli można tego uniknąć, ponieważ ludzie zawsze mylą tabulatory i spacje.
Rozwiązanie problemu jest bardzo proste w języku skryptowym, takim jak Perl, Python lub Ruby. Oto przykładowy kod:
źródło
Chciałem rozwiązania dla Gnu sort w systemie Windows, ale żadne z powyższych rozwiązań nie działało dla mnie w wierszu poleceń.
Korzystając ze wskazówki Lloyda, dla mnie zadziałał następujący plik wsadowy (.bat).
Wpisz znak tabulacji w cudzysłowie.
źródło
Miałem ten problem z sortowaniem w cygwin w powłoce bash, gdy korzystałem z sortowania „general-numeric”. Jeśli podałem
-t$'\t' -kFg
, gdzie F jest numerem pola, to nie zadziałało, ale kiedy podałem oba-t$'\t'
i-kF,Fg
(np.-k7,7g
Dla 7. pola), zadziałało.-kF,Fg
bez-t$'\t'
nie działało.źródło
Jeśli chcesz to ułatwić, mając tylko tabulatory, zamień spacje na tabulatory:
źródło
usage: tr [-Ccsu] string1 string2
tr string1 string2 <some-file
. Wszystko może odczytać plik, o ile może odczytać standardowe wejście.Odpowiedź Larsa Haugsetha działała dla mnie tylko z wiersza poleceń, gdzie daje ten błąd, jeśli została wykonana ze skryptu powłoki:
sortuj: wieloznakowa karta „$ \ t”
Rozwiązanie, jeśli jest zakodowane w skrypcie powłoki, jeśli ktoś go szuka
znak tabulacji znajduje się pomiędzy cytatem.
źródło