bash 从每一行的末尾开始对列表进行排序

bash sort a list starting at the end of each line

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

我的文件包含如下列表:

/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

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

awk -F'/' '{ [=10=]= $NF " " [=10=];print [=10=] |"sort -k1"}' fil  |awk '{print }'
/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

这是一种方法:

sed -e 's|^.*/\(.*\)$|\t[=10=]|' list.txt | sort | cut -f 2-

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

这应该有效:

sort -t/ -k7 input_file