gpt4 book ai didi

linux - 如何在搜索后打印所有具有相同前缀的文件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:21 25 4
gpt4 key购买 nike

我需要搜索一个包含许多子目录的目录,每个子目录都包含文件。文件读取如下 question1234_01,其中 1234 是随机数字,后缀 _01 是包含前缀的消息数,这意味着它们属于同一个连续线程。

find . -name 'quest*' | cut -d_ -f1  | awk '{print $1}' | uniq -c | sort -n  

示例输出:

1 quest1234    
10 quest1523

这将搜索所有文件,然后按顺序对它们进行排序。

我想要做的是打印所有最终出现次数最多的文件,在我的示例中是有 10 个匹配项的文件。

所以它应该只输出 quest1523_01quest1523_11

最佳答案

如果我明白你的意思,并且你想得到一个项目列表,按频率排序,你可以通过管道传递类似的东西:

| sort | uniq -c | sort -k1nr

例如:

输入:

file1
file2
file1
file1
file3
file2
file2
file1
file4

输出:

4 file1
3 file2
1 file3
1 file4

更新

顺便问一下,你用 awk 做什么?

find . -name 'quest*' | cut -d_ -f1  | sort | uniq -c | sort -k1nr | head -n10

返回找到频率更高的 10 个项目。

更新

这是一个大大改进的版本。唯一的缺点是,它 按出现次数排序。不过,我会弄清楚如何修复它:)

find . -name 'question*' | sort \
| sed "s#\(.*/question\([0-9]\+\)_[0-9]\+\)#\2 \1#" \
| awk '{ cnt[$1]++; files[$1][NR] = $2 } END{for(i in files){ print i" ("cnt[i]")"; for (j in files[i]) { print " "files[i][j] } }}'

更新

在对大约 140 万条记录(花费 23 英寸)进行测试后,我认为 awk 处理所有分组等方面的效率太低,所以我用 Python 编写了它:

#!/usr/bin/env python

import sys, re

file_re = re.compile(r"(?P<name>.*/question(?P<id>[0-9]+)_[0-9]+)")

counts = {}
files = {}

if __name__ == '__main__':
for infile in sys.stdin:
infile = infile.strip()
m = file_re.match(infile)
_name = m.group('name')
_id = m.group('id')
if not _id in counts:
counts[_id] = 0
counts[_id]+=1
if not _id in files:
files[_id] = []
files[_id].append(_name)

## Calculate groups
grouped = {}
for k in counts:
if not counts[k] in grouped:
grouped[counts[k]] = []
grouped[counts[k]].append(k)

## Print results
for k, v in sorted(grouped.items()):
for fg in v:
print "%s (%s)" % (fg, counts[fg])
for f in sorted(files[fg]):
print " %s" % f

这个完成所有的拆分、分组和排序工作。在同一个输入文件上运行(添加了所有排序内容)只需要大约 3 英寸。

如果您需要更快的速度,您可以尝试使用 Cython 进行编译,这通常至少要快 30%。

更新 - Cython

好的,我刚刚尝试使用 Cython。

只需将上述文件保存为calculate2.pyx。在同一文件夹中,创建 setup.py:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
cmdclass = {'build_ext': build_ext},
ext_modules = [Extension("calculate2", ["calculate2.pyx"])]
)

还有一个启动器脚本(我将其命名为 calculate2_run.py)

import calculate2
import sys
if __name__ == '__main__':
calculate2.runstuff(sys.stdin)

然后,确保你已经安装了 cython,然后运行:

python setup.py build_ext --inplace

除其他内容外,这应该会生成一个 calculate2.so 文件。

现在,像往常一样使用 calculate2_run.py(只需输入 find 的结果)。

我在同一个输入文件上运行它,没有任何进一步的优化:这次,它花费了 1.99''。

关于linux - 如何在搜索后打印所有具有相同前缀的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12886703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com