Linux 如何根据最后一个字路径中的前两个字符对文件进行排序
请建议如何根据最后一个单词路径中的前两个字符对文件进行排序(使用sort命令)Linux 如何根据最后一个字路径中的前两个字符对文件进行排序,linux,bash,sorting,awk,sed,Linux,Bash,Sorting,Awk,Sed,请建议如何根据最后一个单词路径中的前两个字符对文件进行排序(使用sort命令) /dir/dir/dir/LAST_WORD_PATH 例如: 如果以下路径是 /Config/EMA/M5/Hatki Tekom/Customer Files/fSE-TMOLE.txt 所以最后一条路应该是 fSE-TMOLE.txt 目标是对“最后一个字路径”中的前两个字符进行排序 然后,前两个字符是(来自fSE TMOLE.txt) 完整示例 排序前 /Config
/dir/dir/dir/LAST_WORD_PATH
例如:
如果以下路径是
/Config/EMA/M5/Hatki Tekom/Customer Files/fSE-TMOLE.txt
所以最后一条路应该是
fSE-TMOLE.txt
目标是对“最后一个字路径”中的前两个字符进行排序
然后,前两个字符是(来自fSE TMOLE.txt)
完整示例
排序前
/Config/EMA/M5/Cmo Buria Mobile/dzs Bulia Mole.txt
/Config/EMA/M5/Hatki Tekom/Customer Files/fAE-TMOLE.txt
/Config/EMA/M5/Cmo Buria Mobile/dos Bulia Mole.txt
/Config/EMA/M5/Cmo Bgaia Mobile/Fustoer files/Backup/Cos Buia Mole-2.txt
/Config/EMA/M5/VFONE Roia/Cbdne.ro.txt
/Config/EMA/M5/TEKOM SRJA/IELOM SRJA.txt
/Config/EMA/M5/VP Moe/Bobile.txt
排序后
/Config/EMA/M5/VP Moe/Bobile.txt
/Config/EMA/M5/VFONE Roia/Cbdne.ro.txt
/Config/EMA/M5/Cmo Bgaia Mobile/Fustoer files/Backup/Cos Buia Mole-2.txt
/Config/EMA/M5/Cmo Buria Mobile/dos Bulia Mole.txt
/Config/EMA/M5/Cmo Buria Mobile/dzs Bulia Mole.txt
/Config/EMA/M5/Hatki Tekom/Customer Files/fAE-TMOLE.txt
/Config/EMA/M5/TEKOM SRJA/IELOM SRJA.txt
这个技巧使它:
$ awk 'BEGIN{FS="/"; OFS="|"} {print $NF, $0}' file | sort -fk1 | cut -d'|' -f2-
/Config/EMA/M5/VP Moe/Bobile.txt
/Config/EMA/M5/VFONE Roia/Cbdne.ro.txt
/Config/EMA/M5/Cmo Bgaia Mobile/Fustoer files/Backup/Cos Buia Mole-2.txt
/Config/EMA/M5/Cmo Buria Mobile/dos Bulia Mole.txt
/Config/EMA/M5/Cmo Buria Mobile/dzs Bulia Mole.txt
/Config/EMA/M5/Hatki Tekom/Customer Files/fAE-TMOLE.txt
/Config/EMA/M5/TEKOM SRJA/IELOM SRJA.txt
由于最后一个字段不是固定位置,我们将其复制到行的前面,根据该字段进行排序,然后将其删除
注意排序-f
是忽略大小写,而-k1
是基于第一列进行排序。这个技巧使它:
$ awk 'BEGIN{FS="/"; OFS="|"} {print $NF, $0}' file | sort -fk1 | cut -d'|' -f2-
/Config/EMA/M5/VP Moe/Bobile.txt
/Config/EMA/M5/VFONE Roia/Cbdne.ro.txt
/Config/EMA/M5/Cmo Bgaia Mobile/Fustoer files/Backup/Cos Buia Mole-2.txt
/Config/EMA/M5/Cmo Buria Mobile/dos Bulia Mole.txt
/Config/EMA/M5/Cmo Buria Mobile/dzs Bulia Mole.txt
/Config/EMA/M5/Hatki Tekom/Customer Files/fAE-TMOLE.txt
/Config/EMA/M5/TEKOM SRJA/IELOM SRJA.txt
由于最后一个字段不是固定位置,我们将其复制到行的前面,根据该字段进行排序,然后将其删除
注sort-f
忽略大小写,-k1
根据第一列进行排序。这里有一种方法:
#!/bin/bash
while read f
do
b=$(basename "$f") # Get basic name of file without path
b2=${b:0:2} # Extract first 2 letters
echo $b2:$f # Output for awk to read with colon separator
done < file | sort -f | awk -F: '{print $2}'
#/bin/bash
读f时
做
b=$(basename“$f”)#获取没有路径的文件的基本名称
b2=${b:0:2}#提取前两个字母
echo$b2:$f#输出,用于使用冒号分隔符读取awk
完成
这里有一种方法:
#!/bin/bash
while read f
do
b=$(basename "$f") # Get basic name of file without path
b2=${b:0:2} # Extract first 2 letters
echo $b2:$f # Output for awk to read with colon separator
done < file | sort -f | awk -F: '{print $2}'
#/bin/bash
读f时
做
b=$(basename“$f”)#获取没有路径的文件的基本名称
b2=${b:0:2}#提取前两个字母
echo$b2:$f#输出,用于使用冒号分隔符读取awk
完成
假设您的文件名不包含选项卡,您可以执行以下操作:
cat files | sed s/.*/\&\\t\&/ | sed -r s/.*\\/\(..\).*\\t/\\1/ | sort | sed s/...//
/Config/EMA/M5/VP Moe/Bobile.txt
/Config/EMA/M5/VFONE Roia/Cbdne.ro.txt
/Config/EMA/M5/Cmo Bgaia Mobile/Fustoer files/Backup/Cos Buia Mole-2.txt
/Config/EMA/M5/Cmo Buria Mobile/dos Bulia Mole.txt
/Config/EMA/M5/Cmo Buria Mobile/dzs Bulia Mole.txt
/Eonfig/EMA/M5/Hatki Tekom/Customer Files/fAE-TMOLE.txt
/Config/EMA/M5/TEKOM SRJA/IELOM SRJA.txt
假设文件名不包含选项卡,则可以执行以下操作:
cat files | sed s/.*/\&\\t\&/ | sed -r s/.*\\/\(..\).*\\t/\\1/ | sort | sed s/...//
/Config/EMA/M5/VP Moe/Bobile.txt
/Config/EMA/M5/VFONE Roia/Cbdne.ro.txt
/Config/EMA/M5/Cmo Bgaia Mobile/Fustoer files/Backup/Cos Buia Mole-2.txt
/Config/EMA/M5/Cmo Buria Mobile/dos Bulia Mole.txt
/Config/EMA/M5/Cmo Buria Mobile/dzs Bulia Mole.txt
/Eonfig/EMA/M5/Hatki Tekom/Customer Files/fAE-TMOLE.txt
/Config/EMA/M5/TEKOM SRJA/IELOM SRJA.txt
使用
perl
,这是一种非常可靠的方法:
#! /bin/bash
input=/tmp/file
perl -F/ -anle '
$F[$#F] =~ /^(..)/;
$key="\U$1";
$h{$key}=[] unless exists $h{$key};
push ${h{$key}},$_;
END{
foreach $key (sort keys %h){
foreach( @{$h{$key}}){
print "$_"
}
}
}' $input
说明:
它使用转换为大写的最后一个字段的前两个字符作为其键创建哈希。哈希逻辑如下所示:
$VAR1 = {
'IE' => [
' /Config/EMA/M5/TEKOM SRJA/IELOM SRJA.txt'
],
'CO' => [
' /Config/EMA/M5/Cmo Bgaia Mobile/Fustoer files/Backup/Cos Buia Mole-2.txt'
],
'DZ' => [
' /Config/EMA/M5/Cmo Buria Mobile/dzs Bulia Mole.txt'
],
'CB' => [
' /Config/EMA/M5/VFONE Roia/Cbdne.ro.txt'
],
'FA' => [
' /Config/EMA/M5/Hatki Tekom/Customer Files/fAE-TMOLE.txt'
],
'DO' => [
' /Config/EMA/M5/Cmo Buria Mobile/dos Bulia Mole.txt'
],
'BO' => [
' /Config/EMA/M5/VP Moe/Bobile.txt'
]
};
然后,我们根据键和打印值对哈希进行排序
PS.此解决方案考虑了重复密钥的情况,因为它为每个密钥创建了一个数组。它也应该比目前为止提供的任何解决方案都要快,因为它都是用perl完成的,没有shell fork。使用
perl来完成它的一种非常可靠的方法:
#! /bin/bash
input=/tmp/file
perl -F/ -anle '
$F[$#F] =~ /^(..)/;
$key="\U$1";
$h{$key}=[] unless exists $h{$key};
push ${h{$key}},$_;
END{
foreach $key (sort keys %h){
foreach( @{$h{$key}}){
print "$_"
}
}
}' $input
说明:
它使用转换为大写的最后一个字段的前两个字符作为其键创建哈希。哈希逻辑如下所示:
$VAR1 = {
'IE' => [
' /Config/EMA/M5/TEKOM SRJA/IELOM SRJA.txt'
],
'CO' => [
' /Config/EMA/M5/Cmo Bgaia Mobile/Fustoer files/Backup/Cos Buia Mole-2.txt'
],
'DZ' => [
' /Config/EMA/M5/Cmo Buria Mobile/dzs Bulia Mole.txt'
],
'CB' => [
' /Config/EMA/M5/VFONE Roia/Cbdne.ro.txt'
],
'FA' => [
' /Config/EMA/M5/Hatki Tekom/Customer Files/fAE-TMOLE.txt'
],
'DO' => [
' /Config/EMA/M5/Cmo Buria Mobile/dos Bulia Mole.txt'
],
'BO' => [
' /Config/EMA/M5/VP Moe/Bobile.txt'
]
};
然后,我们根据键和打印值对哈希进行排序
PS.此解决方案考虑了重复密钥的情况,因为它为每个密钥创建了一个数组。它也应该比目前为止提供的任何解决方案都要快,因为它都是在perl中完成的,没有shell fork。您也可以使用这种方法
sed -r 's@^(/.*/)(.*)@\2|\1\2@g' filename | sort | sed -r 's/^[^|]+.(.*)/\1/g'
您也可以使用此方法
sed -r 's@^(/.*/)(.*)@\2|\1\2@g' filename | sort | sed -r 's/^[^|]+.(.*)/\1/g'
这可能适用于您(GNU sed和排序):
提取“最后一个字”的前2个字符,并在每行前加上前缀。使用预先指定的键保留位置进行排序,使用稳定排序。删除带前缀的键。这可能适用于您(GNU-sed和sort):
提取“最后一个字”的前2个字符,并在每行前加上前缀。使用预先指定的键保留位置进行排序,使用稳定排序。移除预先准备好的钥匙。@fedorqui感谢您的建议-我已将其添加到:-)@fedorqui感谢您的建议-我已将其添加到:-)@Maihabunah它可以更短,但它的站立方式已经很难阅读:)
@Maihabunah它可以更短,但它的站立方式已经很难阅读:)