Awk 对具有唯一前缀的文件进行计数

Awk 对具有唯一前缀的文件进行计数,awk,Awk,我有一组如下所示的文件。我正在寻找一种计算所有具有唯一前缀的文件的好方法,其中“前缀”由第二个连字符之前的所有字符定义 0406-0357-9.jpg 0591-0349-9.jpg 0603-3887-27.jpg 59762-1540-40.jpg 68180-517-6.jpg 0406-0357-90.jpg 0591-0349-90.jpg 0603-3887-28.jpg 59762-1540-41.jpg 68180-517-7.jpg 0406-0357-91.j

我有一组如下所示的文件。我正在寻找一种计算所有具有唯一前缀的文件的好方法,其中“前缀”由第二个连字符之前的所有字符定义

0406-0357-9.jpg   0591-0349-9.jpg   0603-3887-27.jpg  59762-1540-40.jpg 68180-517-6.jpg
0406-0357-90.jpg  0591-0349-90.jpg  0603-3887-28.jpg  59762-1540-41.jpg 68180-517-7.jpg
0406-0357-91.jpg  0591-0349-91.jpg  0603-3887-29.jpg  59762-1540-42.jpg 68180-517-8.jpg
0406-0357-92.jpg  0591-0349-92.jpg  0603-3887-3.jpg   59762-1540-5.jpg  68180-517-9.jpg
0406-0357-93.jpg  0591-0349-93.jpg  0603-3887-30.jpg  59762-1540-6.jpg
这应该做到:

ls *.jpg | cut -d- -s -f1,2 | uniq | wc -l
或者,如果前缀始终是4位数字、一个破折号和4位数字,则不需要剪切:

ls *.jpg | uniq -w9 | wc -l
这应该做到:

ls *.jpg | cut -d- -s -f1,2 | uniq | wc -l
或者,如果前缀始终是4位数字、一个破折号和4位数字,则不需要剪切:

ls *.jpg | uniq -w9 | wc -l

根据您实际想要的输出,以下任一项可能是您想要的:

ls | awk -F'-' '{c[$1"-"$2]++} END{for (p in c) print p, c[p]}'


如果是其他内容,请更新您的问题,以显示您正在寻找的输出。

根据您实际想要的输出,以下任一项可能是您想要的:

ls | awk -F'-' '{c[$1"-"$2]++} END{for (p in c) print p, c[p]}'

如果是其他问题,请更新您的问题以显示您正在查找的输出。

解析
ls
(不好,但看起来不会导致这些文件名出现问题), 使用
awk
将字段分隔符设置为
-

!seen[$1,$2]++)
使用一个关联数组,将
$1,$2
作为键并递增,然后检查值是否等于0以确保只打印一次(基于
$1
$2
)。
打印
在屏幕上打印:)

现在将根据带有标题的前缀进行计数:)

解析
ls
(不好,但看起来不会导致这些文件名出现问题), 使用
awk
将字段分隔符设置为
-

!seen[$1,$2]++)
使用一个关联数组,将
$1,$2
作为键并递增,然后检查值是否等于0以确保只打印一次(基于
$1
$2
)。
打印
在屏幕上打印:)



现在将根据带有标题的前缀进行计数:)

对于此示例输入,输出将是什么样子?
ls | awk'{FS=“-”};//{if(a[$1$2]+==0)print$0;}'
@Jidder-该awk命令中有多个bug,而且通常是错误的。跳出的问题:不需要分号,在条件而不是操作空间中使用条件,不连接数组索引的字段,因为它基于字段值失败(
12 3
1 23
都连接到
123
),为每个记录设置FS效率低下,并且第一个记录失败(在设置FS之前拆分),不需要打印$0,因为这是默认值,测试NF是否存在字段而不是//,如果条件在正确的位置,则根本不需要显式打印。@Jidder更一般地说,如果您还没有阅读手册,请不要尝试“帮助”人。@Jidder这是有效的!除了一个错误。把它写下来作为答案,我会接受。这里是错误:0069-4210-0.jpg和0069-4210-10.jpg都被打印。对于这个示例输入,输出是什么样子的?
ls|awk'{FS=“-”};/./{if(a[$1$2]+==0)打印$0;}“
@Jidder-该awk命令中有多个bug,而且通常是错误的。跳出的问题是:不需要分号,在条件中使用条件而不是操作空间,不连接数组索引的字段,因为它基于字段值失败(
12 3
1 23
都连接到
123
),为每个记录设置FS效率低下,第一个记录设置FS失败(在设置FS之前分割),不需要打印$0,因为这是默认值,测试NF中的字段是否存在而不是//,如果条件在正确的位置,则根本不需要显式打印。@Jidder更一般地说,如果您还没有阅读手册,请不要尝试“帮助”人。@Jidder这很有效!除了一个错误。把它写下来作为答案,我会接受的。这里是错误:0069-4210-0.jpg和0069-4210-10.jpg都是打印出来的。请注意,解析
ls
output@Pankrates是非常不明智的,我不会说这是“非常不明智的”在这种情况下。文件名看起来很正常。文件并不总是由一个连字符分隔的四位数字。例如,59762-1540-42.jpg。这就是为什么我希望在第二个连字符之前的所有字符上都是唯一的。@RosePerrone在这种情况下,我给出的第一个管道应该可以工作。+1;如果你想避免使用
ls
,请尝试
printf'%s\n'*.jpg
(不会保护带有嵌入式
\n
字符的文件名,但这很少是一个现实问题)。请注意,解析
ls
output@Pankrates是非常不明智的,我不会说这是“非常不明智的”在这种情况下。文件名看起来很正常。文件并不总是由一个连字符分隔的四位数字。例如,59762-1540-42.jpg。这就是为什么我希望在第二个连字符之前的所有字符上都是唯一的。@RosePerrone在这种情况下,我给出的第一个管道应该可以工作。+1;如果你想避免使用
ls
,请尝试
printf'%s\n'*.jpg
(不会保护嵌入
\n
字符的文件名,但这很少是现实世界中的问题).+1使用
awk
而不是像我那样使用多个程序可能是个好主意。嘿,像我在回答中那样引用
ls
来确保不使用别名是不是一个好主意?还是因为别名是管道的一部分而保证不使用别名?显然
ls
在管道中的作用有点不同因为它将每个文件都列在单独的一行上。但是
ls-F
的别名仍然会附加分类字符。如果你要引用
ls
,那么为什么不引用其他所有命令呢?我不想麻烦了-在路径中使用
ls
,而不是你自己的别名绊倒你的风险更大。我知道你不会打扰…谁会呢?这太疯狂了!但这就是别名的问题。如果
ls
被别名为
ls-F
,并且你不想要分类字符,那么如果从命令行键入命令,你几乎必须引用它。另一个poss