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
我有一个包含文件路径和文件名的文件,我想从字符串末尾开始排序。
我的文件包含如下列表:
/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