按行结束内容排序明文


0

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

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

例如:

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机器。

任何帮助表示赞赏。


给我们更多的数据和信息。我们需要看到更多的记录。看起来所有的线都是可变长度的吧?行中是否有分隔符,或者它只是不同数量的空格?
Jan Doggen 2013年

好的,我添加了一些样本输入。
voxanimus 2013年

如果它对你有帮助,我已经上传了源文件供下载:mediafire.com/view/?
555jioewcto5w4y

Answers:


3

如果您的输入字段没有明确分隔,例如因为标题也包含空格,则不能假设您的数值具有特定的列索引。因此,您需要一个能够提取最后一列的工具,而不管其索引如何。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

谢谢您的回答!我尝试在终端中运行您的命令,将“input.txt”替换为文本文件的路径名,但我收到以下错误:“awk:无法打开文件用户/(我的名字)/Downloads/test_sort_list.txt来源第1行“你知道可能会发生什么吗?我编辑了原始问题以包含更多输入。
voxanimus 2013年

我把空间当作分隔符。当我回到我的电脑上时,会尝试修复它,但也许你可以在某处提供你的输入文件供下载?我不知道这里的编辑是否删除了任何内容。
slhck 2013年

肯定的。你在这里:mediafire.com/view/?
555jioewcto5w4y

感谢您提供该文件。它Tab在每个换行符之前都有一个字符,在原始帖子中不可见。我用你的文件命令更新了我的答案。
slhck 2013年

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

难道sort不处理CRLF或ISO-8859编码?cut -d$'\t' -f4给出正确的列。
slhck 2013年

在这种情况下,CRLF行结尾无关紧要,但当LC_CTYPE设置为en_US.UTF-8时,sort为原始ISO-8859-1文件提供了非法的字符序列错误。
2013年

啊,我明白了。LC_CTYPE设置为C后,无需转换即可运行。
slhck 2013年

1

只需一行输入就很难准确说出你需要什么。如果您的整个文件格式相同,那么:

sort -k 10 input

足够您的样本输入。如果您有可变长度的行,则必须添加额外的步骤才能找到最后一列。这个关于SO的答案可能是你正在寻找的东西。


链接问题的作者的文件有逗号分隔的字段。我的字段以制表符分隔。谢谢,但是!
voxanimus 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.