3

我有大约 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

4

2 回答 2

9
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

ls *.pdf在当前目录中有很多 pdf 时使用会将ls参数溢出lsARGV.

于 2013-05-20T16:07:28.807 回答
2

本着“有不止一种方法可以做到这一点”的精神,这里有一个 perl one-liner,它在功能上等同于 qwwqwwq 的 shell 管道:

perl -le 'my %seen; print for sort grep !$seen{$_}++, map { (split /\./)[1] } <*>'

<*>可以用任何 glob 表达式替换,例如<*.pdf>仅对名称以 . 结尾的文件进行操作.pdf

于 2013-05-20T16:20:34.777 回答