我有一个按以下格式组织的纯文本列表:
[文件路径名] [曲目名称] [艺术家姓名] [数值]
例如:
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 机器。
任何帮助都将受到赞赏。
答案1
如果您的输入字段没有明确分隔,例如因为标题也包含空格,则您无法为数值假设特定的列索引。因此,您需要一个能够提取最后的列,无论其索引如何。awk
可以这样做:
awk '{ printf $NF; $NF=""; print "", $0 }' input.txt | sort -rn
解释:
printf $NF
打印最后一个字段。printf
是必要的,因为常规print
也会打印换行符。$NF
被清除了,所以我们基本上删除了最后一列。print "", $0
打印以一个空格为前缀的整行。- 然后按数字顺序排序(
-n
)并进行反转(-r
)。
该解决方案适用于 OS X 原生的 BSD 命令以及 Linux 附带的 GNU 工具。
在您的特定情况下,文件格式不正确。每个换行符前都有一个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
答案3
仅通过一行输入很难准确判断您需要什么。如果整个文件采用相同的格式,则:
sort -k 10 input
对于您的示例输入来说已经足够了。如果您有可变长度的行,则必须添加额外的步骤来查找最后一列。这那么 SO 上的答案可能就是您正在寻找的东西。