按行尾内容对纯文本进行排序

按行尾内容对纯文本进行排序

我有一个按以下格式组织的纯文本列表:

[文件路径名] [曲目名称] [艺术家姓名] [数值]

例如:

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 上的答案可能就是您正在寻找的东西。

相关内容