我有一个文件夹,其中包含以下内容的文件。
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
我想提取具有上述类型行的文件的名称。这样做的简单方法是什么?
答案 0 :(得分:3)
参考Erik E. Lorenz的回答 你可以简单地做到
grep -l '\s-\?[0-9.]\+-[0-9.]\+\s' dir/*
来自grep man page
-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.
答案 1 :(得分:2)
grep和cut的组合适用于我:
grep -H -m 1 '\s-\?[0-9.]\+-[0-9.]\+\s' dir/* | cut -d: -f1
执行以下步骤:
dir/*
中的每个文件,找到仅由短划线分隔的两个相邻数字的第一个匹配项(-m 1
)-H
)打印它。无论如何应该是默认值。cut
这很快,因为它只查找第一个行匹配。如果其他地方有两个相邻的数字,请考虑更改正则表达式。
编辑:
这与科学记数法不符,可能会错误地报告诸如' .-。'等内容,例如在评论中。如果您正在处理其中一个,则必须扩展正则表达式。
答案 2 :(得分:0)
awk 'NF > 10 && $1 ~ /^[[:upper:]]+$/ && $2 ~ /^[[:digit:]]+/ { print FILENAME; nextfile }' *
将打印包含10个以上字段的文件,其中第一个字段全部为大写字母,第二个字段为全部数字。
答案 3 :(得分:0)
对nextfile
使用GNU awk:
awk '$7 ~ /[0-9]-[0-9]/{print FILENAME; nextfile}' *
或更高效,因为如果给定文件中的所有行具有相同的格式,您只需要测试每个文件的第一行:
awk 'FNR==1{if ($7 ~ /[0-9]-[0-9]/) print FILENAME; nextfile}' *