我有大约50K文件是一个目录(linux OS),它们的命名约定为 USER_ID.ORACLE_JOB_ID.SEQUENCED_NUMBER.pdf
我需要在文本文件中列出所有唯一的ORACLE_JOB_ID。怎么办呢?
PS:忘记提及同一目录中有一些其他文件有不同的命名约定,我必须避免使用它们。
谢谢!
实施例: 1.6778390.done 2.o6778390.out 3.AWRX_GBL_FAR1.98567432.4.dat.xml 的 4.AWRX_GBL_FAR1.34789214.4.pdf
答案 0 :(得分:6)
ls | awk 'BEGIN{FS="."}{ print $2 }' | sort | uniq > file.txt
ls
获取当前目录中所有文件名的列表
awk
通过字段分隔符"分割每个文件名。",仅打印第二个字段
sort
对第二个字段进行排序
uniq
删除连续的相同行
编辑:如果你想使用.pdf限制当前目录中的文件:
find . -iname '*.pdf' | awk 'BEGIN{FS="."}{ print $3 }' | sort | uniq > file.txt
当当前目录中有许多pdf时,使用ls *.pdf
会将参数溢出到ls
,如错误所示,因为它相当于使用50K不同的命令行调用ls
参数,溢出ARGV
。
答案 1 :(得分:2)
本着“有多种方法可以做到这一点”的精神,这里有一个perl单行程,在功能上等同于qwwqwwq的shell管道:
perl -le 'my %seen; print for sort grep !$seen{$_}++, map { (split /\./)[1] } <*>'
<*>
可以替换为任何glob表达式,例如<*.pdf>
仅对名称以.pdf
结尾的文件进行操作。