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



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

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

最新更新