Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
Bash脚本中的排序问题_Bash_Sorting_Sed_Find_Filenames - Fatal编程技术网

Bash脚本中的排序问题

Bash脚本中的排序问题,bash,sorting,sed,find,filenames,Bash,Sorting,Sed,Find,Filenames,我有一个完整的文件名,从下面的find命令输出: find "$ARCHIVE" -type f -name *_[0-9][0-9] | sed 's/_[0-9][0-9]$//' > temp 我现在正试图对这些文件名进行排序,并对它们进行计数,以找出哪一个文件名显示得最多。我遇到的问题是,无论何时执行: sort -g temp 它将所有已排序的文件名打印到命令行,我不确定为什么。在此问题上的任何帮助都将不胜感激 您可能需要: sort temp| uniq -c | sort

我有一个完整的文件名,从下面的find命令输出:

find "$ARCHIVE" -type f -name *_[0-9][0-9] | sed 's/_[0-9][0-9]$//' > temp
我现在正试图对这些文件名进行排序,并对它们进行计数,以找出哪一个文件名显示得最多。我遇到的问题是,无论何时执行:

sort -g temp
它将所有已排序的文件名打印到命令行,我不确定为什么。在此问题上的任何帮助都将不胜感激

您可能需要:

sort temp| uniq -c | sort -nr
首先我们对temp进行排序,然后根据出现次数uniq-c为行添加前缀,然后根据字符串数值sort-n进行比较,最后一个命令反转比较结果sort-r

示例文件:

/home/user/testfiles/405/prob405823
/home/user/testfiles/405/prob405823
/home/user/testfiles/527/prob527149
/home/user/testfiles/518/prob518433
输出:

  2 /home/user/testfiles/405/prob405823
  1 /home/user/testfiles/527/prob527149
  etc..
资源:

您可能需要:

sort temp| uniq -c | sort -nr
首先我们对temp进行排序,然后根据出现次数uniq-c为行添加前缀,然后根据字符串数值sort-n进行比较,最后一个命令反转比较结果sort-r

示例文件:

/home/user/testfiles/405/prob405823
/home/user/testfiles/405/prob405823
/home/user/testfiles/527/prob527149
/home/user/testfiles/518/prob518433
输出:

  2 /home/user/testfiles/405/prob405823
  1 /home/user/testfiles/527/prob527149
  etc..
资源:


在使用GNU awk 4的一个awk命令中查找之后,您可以执行所有操作。*:

find "$ARCHIVE" -type f -name *_[0-9][0-9] |
awk '
{ cnt[gensub(/_[0-9][0-9]$/,"","")]++ }
END {
    PROCINFO["sorted_in"] = "@val_num_desc"
    for (file in cnt) {
        print cnt, file
    }
}
'

在使用GNU awk 4.*的find in one awk命令后,您可以执行所有操作:

find "$ARCHIVE" -type f -name *_[0-9][0-9] |
awk '
{ cnt[gensub(/_[0-9][0-9]$/,"","")]++ }
END {
    PROCINFO["sorted_in"] = "@val_num_desc"
    for (file in cnt) {
        print cnt, file
    }
}
'

Sort不会对文件进行适当的排序,它接受输入并对其进行排序,然后将其打印到stdout,如果您不想将其重定向到同一个文件,则可以将其重定向到另一个文件,因为如果这样做,您将开始在试图读取的文件上进行写入。您可以发布一个简短的temp示例吗?你想计算一个文件在文档上出现的次数,对吗?@PedroLobito我发布了一个简短的temp摘录,是的,你是对的。Sort不会对一个文件进行适当的排序,它会接受一个输入并对其进行排序,然后将其打印到stdout,如果你不想将其重定向到同一个文件,你可以将其重定向到另一个文件,因为如果你这样做了,你会开始在你试图读取的文件上写东西。你能发布一个简短的temp示例吗?你想计算一个文件在文档上出现的次数,对吗?@PedroLobito我发布了一个简短的temp摘录,是的,你是对的。你可以完全排除cat temp out,只需对temp进行排序| uniq-c | sort-nr…或者在直接提供可查找的文件句柄时进行排序,sort可以在开始处理内容之前查看文件的大小,并智能地决定是否需要写入临时文件或是否可以将所有内容保留在RAM中;当只提供管道时,该信息不可用。您可以将cat temp out全部删除,只需对temp | uniq-c | sort-nr进行排序…或者在提供直接的、可查找的文件句柄时进行排序,sort可以在开始处理内容之前查看文件的大小,并智能地决定是否需要写入临时文件或是否可以将所有内容保留在RAM中;当只给出一个管道时,该信息是不可用的。在这里对名称进行NUL定界,从而消除名称表示的歧义,至少在find->awk端是这样的吗?当然,如果它们以不明确的形式从awk中发出,那么这可能没有什么用处。是的,您可以将-print0添加到find中,然后在awk命令中使用-v RS='\0'。如果我们还设置了ORS='\0',那么如果有用的话,awk也会输出NUL分隔的名称。在这里用NUL分隔名称是否很简单,从而至少在find->awk端用换行符消除名称表示的歧义?当然,如果它们以不明确的形式从awk中发出,那么这可能没有什么用处。是的,您可以将-print0添加到find中,然后在awk命令中使用-v RS='\0'。如果我们还设置了ORS='\0',那么如果有用的话,awk也会输出NUL分隔的ORS。