Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何根据最后一个字路径中的前两个字符对文件进行排序_Linux_Bash_Sorting_Awk_Sed - Fatal编程技术网

Linux 如何根据最后一个字路径中的前两个字符对文件进行排序

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

请建议如何根据最后一个单词路径中的前两个字符对文件进行排序(使用sort命令)

   /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它可以更短,但它的站立方式已经很难阅读
:)