根据条件从文件夹中提取文件名

时间:2014-07-30 08:54:27

标签: bash awk grep

我有一个文件夹,其中包含以下内容的文件。

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  

我想提取具有上述类型行的文件的名称。这样做的简单方法是什么?

4 个答案:

答案 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}' *