bash从每行末尾开始排序列表

时间:2016-09-23 11:25:46

标签: bash sorting filelist

我有一个包含文件路径和文件名的文件,我想从字符串末尾开始排序。

我的文件包含如下列表:

/Volumes/Location/Workers/Andrew/2015-08-12_Andrew_PC/DOCS/3177109.doc
/Volumes/Location/Workers/Andrew/2015-09-17_Andrew_PC/DOCS/2130419.doc
/Volumes/Location/Workers/Bill/2016-03-17_Bill_PC/DOCS/1998816.doc
/Volumes/Location/Workers/Charlie/2016-07-06_Charlie_PC/DOCS/4744123.doc

我想对此列表进行排序,使文件名是顺序的,这有助于根据文件名查找重复项,无论路径如何。

列表应如下所示:

/Volumes/Location/Workers/Bill/2016-03-17_Bill_PC/DOCS/1998816.doc
/Volumes/Location/Workers/Andrew/2015-09-17_Andrew_PC/DOCS/2130419.doc
/Volumes/Location/Workers/Andrew/2015-08-12_Andrew_PC/DOCS/3177109.doc
/Volumes/Location/Workers/Charlie/2015-07-06_Charlie_PC/DOCS/4744128.doc

3 个答案:

答案 0 :(得分:3)

这是一种方法:

sed -e 's|^.*/\(.*\)$|\1\t\0|' list.txt | sort | cut -f 2-

这使用sed将文件名的副本插入每行的开头,以便我们可以使用sort对列表进行排序。然后我们删除我们在第一步中添加的内容。

答案 1 :(得分:2)

这应该有效:

sort -t/ -k7 input_file

答案 2 :(得分:1)

这将根据动态的最后一个字段进行排序,该字段由/分隔。  首先,它会将最后一个字段追加到行的开头,然后sort。先前附加的第一个字段将被第二个awk删除。

awk -F'/' '{ $0= $NF " " $0;print $0 |"sort -k1"}' fil  |awk '{print $2}'
/Volumes/Location/Workers/Bill/2016-03-17_Bill_PC/DOCS/1998816.doc
/Volumes/Location/Workers/Andrew/2015-09-17_Andrew_PC/DOCS/2130419.doc
/Volumes/Location/Workers/Andrew/2015-08-12_Andrew_PC/DOCS/3177109.doc
/Volumes/Location/Workers/Charlie/2016-07-06_Charlie_PC/DOCS/4744123.doc