У меня есть список открытого текста в следующем формате:

[путь к файлу] [название трека] [имя исполнителя] [числовое значение]

например:

C:\Users\Somi\Music\Shaheedi.mp3    Shaheedi [By.NagRa] [Rp] Pasla Jatha Birmingham 140.01
C:\Users\Somi\Music\08 - Idgaf.mp3  Idgaf   Bohemia (www.nannu.info)    88.01   
C:\Users\Somi\Music\08 - Klasikhz - Hangower.mp3    Hangower    Klasikhz    101.06  
C:\Users\Somi\Music\4. Manni Sandhu  -  Pegg 2012[CrazyMasti.Com].mp3   4.  Manni Sandhu  -  Pegg 2012[CrazyMasti.Com]  Manni Sandhu[CrazyMasti.Com]    103.01  
C:\Users\Somi\Music\5. Manni Sandhu  -  Jaan Sadi[CrazyMasti.Com].mp3   5. Manni Sandhu  -  Jaan Sadi[CrazyMasti.Com]   Manni Sandhu[CrazyMasti.Com]    94.01   
C:\Users\Somi\Music\6. Manni Sandhu  -  Gidhian Di Rani[CrazyMasti.Com].mp3 6. Manni Sandhu  -  Gidhian Di Rani[CrazyMasti.Com] Manni Sandhu[CrazyMasti.Com]    95.00   
C:\Users\Somi\Music\7. Manni Sandhu  -  Door Ni Kulne[CrazyMasti.Com].mp3   7. Manni Sandhu  -  Door Ni Kulne[CrazyMasti.Com]   Manni Sandhu[CrazyMasti.Com]    94.00   
C:\Users\Somi\Music\8. Manni Sandhu  -  Bottle[CrazyMasti.Com].mp3  8. Manni Sandhu  -  Bottle[CrazyMasti.Com]  Manni Sandhu[CrazyMasti.Com]    123.99  

Каждая запись в списке отделяется от следующей жестким возвратом. Также кажется, что числовое значение терминала отделено от остальной части строки вкладкой. Есть ли способ сортировки этих записей по этому конечному числовому значению? То есть, есть ли какой-нибудь способ, которым я могу расположить их все так, чтобы конечные числовые значения были восходящими или нисходящими?

Я использую OS X Lion, но при необходимости я могу просто перенести текстовый файл на компьютер с Windows.

Любая помощь приветствуется.

3 ответа3

3

Если ваши поля ввода не разделены однозначно, например, потому что заголовки также содержат пробелы, вы не можете принять конкретный индекс столбца для вашего числового значения. Следовательно, вам нужен инструмент, способный извлечь последний столбец независимо от его индекса. awk может сделать это:

awk '{ printf $NF; $NF=""; print "", $0 }' input.txt | sort -rn

Объяснение:

  • printf $NF печатает последнее поле. printf необходим, потому что обычная print печатает также и новую строку.
  • $NF очищается, поэтому мы в основном удаляем последний столбец.
  • print "", $0 печатает всю строку с префиксом в один пробел.
  • Затем он сортируется численно (-n) и переворачивается (-r).

Это решение работает как с командами BSD, родными для OS X, так и с инструментами GNU, которые поставляются с Linux.


В вашем конкретном случае файл не отформатирован. У вас есть символ Tab перед каждой новой строкой, так что это неправильно анализируется как последнее поле. Для вашего файла команда awk будет выглядеть следующим образом. Здесь NF-1 относится ко второму-последнему полю.

awk '{ printf $(NF-1); $(NF-1)=""; print "", $0 }' test_sort_list.txt | sort -rn

Пример:

% head -n 5 test_sort_list.txt
C:\Users\Somi\Music\(DJNagRa) Nachna Pawu - TeamPBN By NagRa.mp3    Nachna Pawu(DJNagRa)    TeamPBN(DJNagRa)    96.00
C:\Users\Somi\Music\(DJNagRa) Ni Goriyeh ft Billa Bakshi DJ Rags By NagRa.mp3   Ni Goriyeh (feat. Billa Bakshi)(DJNagRa)    DJ Rags(DJNagRa)    132.28
C:\Users\Somi\Music\(UMP) 08 Jassi J & Bhinda Jatt - Khushiya.mp3   Khushiya    (UMP) Jassi J & Bhinda Jatt 100.00
C:\Users\Somi\Music\(UMP) 09 Jassi J, Manjit Pappu & Cheshire Cat - Sadde Ton Piyara (Remix).mp3    Sadde Ton Piyara (Remix)    (UMP) Jassi J, Manjit Pappu & Cheshire Cat  85.99
C:\Users\Somi\Music\-  Baagi Ja Badshah - Bol Dehliye [www.Bhangracrew.com].mp3 Baagi Ja Badshah - Bol Dehliye  [BC] Santnam Singh Arshi Jatha  40.00

% awk '{ printf $(NF-1); $(NF-1)=""; print "", $0 }' test_sort_list.txt | sort -rn | head -n 5
250.00 C:\Users\Somi\Music\bilzkashif-bb06(www.songs.pk).mp3 Dil Nahin Lagda The Bilz and Kashif
250.00 C:\Users\Somi\Music\[WwD] Panjabi MC - Bari Barsi (12 Months) [iTunes-Rip].mp3 Bari Barsi (12 Months) Panjabi MC [www.worldwidedesis.com]
164.28 C:\Users\Somi\Music\Darh Tere Teh-VipJaTT.CoM.mp3 Darh Tere Teh-VipJaTT.CoM
164.07 C:\Users\Somi\Music\Jado Kade Tohar Shohar-VipJaTT.CoM.mp3 Jado Kade Tohar Shohar [VipJaTT.CoM] Gippy Grewal [VipJaTT.CoM]
164.04 C:\Users\Somi\Music\Dil Nachda.mp3 Dil Nachda Diljit VipJaTT.CoM
2

Сначала преобразуйте файл в UTF-8 и LF:

$ file test_sort_list.txt
test_sort_list.txt: ISO-8859 English text, with very long lines, with CRLF line terminators
$ iconv -f iso-8859-1 -t utf-8 test_sort_list.txt | tr -d '\r' > test_sort_list2.txt
$ file test_sort_list2.txt
test_sort_list2.txt: UTF-8 Unicode English text, with very long lines

Затем используйте sort -nk4:

sort -t$'\t' -rnk4 test_sort_list2.txt
1

С одной строкой ввода трудно сказать точно, что вам нужно. Если весь ваш файл в том же формате, то:

sort -k 10 input

Было бы достаточно для вашего образца ввода. Если у вас есть строки переменной длины, вам нужно будет добавить дополнительный шаг, чтобы найти последний столбец. Этот ответ на SO, вероятно, то, что вы ищете.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .