我有一个文件夹,里面有包含以下内容的文件。
ATOM 9 CE1 PHE A 1 70.635 -26.989 98.805 1.00 39.17 C
ATOM 10 CE2 PHE A 1 69.915 -26.416 100.989 1.00 42.21 C
ATOM 11 CZ PHE A 1 -69.816 26.271 -99.622 1.00 40.62 C
ATOM 12 N PRO A 2 -69.795 30.848 101.863 1.00 44.44 N
在一些文件中,第7列的外观如下。
ATOM 9 CE1 PHE A 1 70.635-26.989 98.805 1.00 39.17 C
ATOM 10 CE2 PHE A 1 69.915-26.416 100.989 1.00 42.21 C
ATOM 11 CZ PHE A 1 -69.816-26.271 -99.622 1.00 40.62 C
ATOM 12 N PRO A 2 -69.795-30.848 101.863 1.00 44.44 N
我想提取具有以上类型行的文件的名称。做这件事最简单的方法是什么?
参考Erik E.Lorenz的答案你可以简单地做
grep -l 's-?[0-9.]+-[0-9.]+s' dir/*
来自grep手册页
-l
(The letter ell.) Write only the names of files containing selected
lines to standard output. Pathnames are written once per file searched.
If the standard input is searched, a pathname of (standard input) will
be written, in the POSIX locale. In other locales, standard input may be
replaced by something more appropriate in those locales.
grep和cut的组合适用于我:
grep -H -m 1 's-?[0-9.]+-[0-9.]+s' dir/* | cut -d: -f1
这将执行以下步骤:
- 对于
dir/*
中的每个文件,查找仅用短划线分隔的两个相邻数字的第一个匹配项(-m 1
- 打印时,文件名已预先准备好(
-H
(。无论如何都应该是默认值 - 使用
cut
提取文件名
这很快,因为它只寻找第一个线匹配。如果其他地方有两个相邻的数字,请考虑更改正则表达式。
编辑:
这与科学符号不匹配,可能会错误地报告诸如".-."之类的内容,例如在评论中。如果您正在处理其中一个问题,则必须扩展regex。
awk 'NF > 10 && $1 ~ /^[[:upper:]]+$/ && $2 ~ /^[[:digit:]]+/ { print FILENAME; nextfile }' *
将打印包含10个以上字段的文件,其中第一个字段全部为大写字母,第二个字段全部是数字。
为nextfile
:使用GNU awk
awk '$7 ~ /[0-9]-[0-9]/{print FILENAME; nextfile}' *
或者更有效,因为如果给定文件中的所有行都具有相同的格式,则只需要测试每个文件的第一行:
awk 'FNR==1{if ($7 ~ /[0-9]-[0-9]/) print FILENAME; nextfile}' *