0

我正在尝试处理大量文本文件。这些文本文件包含以下两个连续行之一:

“_atom_site_fract_z”后跟“#END”

或者

"_atom_site_fract_z" 后跟字符串,例如 "C1 C 0.46450 0.18880 0.92540"

我想使用 bash/sed 仅保留后一种类型的文件(没有“_atom_site_fract_z”后跟“#END”的文件)。

我如何实现这一目标?

注意:两个字符串由 NEWLINE 分隔。它们没有被空格隔开。

更新:文件名存储在一个文本文件中,我想逐行读取文本文件,以检查是否应该保留该文件。我不一定要删除它们,但想将稍后键入的文件保存在目录中的单独文件夹中。

UPDATE2:除了这两行之外,还有“其他行”。我想搜索具有两行特定组合的文件。所有文件都有“_atom_site_frac_z”和“#END”,但它们不会一个接一个地出现。但是,“_atom_site_frac_z”总是出现在“#END”之前。

4

2 回答 2

3

您说您只想保留后一种类型的文件sed可能对处理行很有用,但对于你可能想要的整个grep文件find

find "$dir" -type f -exec grep -qF '_atom_site_fract_z#END' {} \; -print # get a list of the files to delete.
find "$dir" -type f -exec grep -qF '_atom_site_fract_z#END' {} \; -delete # actually delete them

更新

如果您的文件来自换行符分隔的文本文件中的列表,那么您可以像这样处理它们:

while read filename; do
    awk '!/#END/{
        checkNext=0;
    } /_atom_site_fract_z/{
        checkNext=1;
        next;
    } /#END/{
        if (checkNext) {
            print(FILENAME);
            exit(0);
        }
    }' "$filename"
done < list_of_files.txt
于 2013-01-14T23:08:40.880 回答
0

如果以上方法在这里不起作用,这是我的解决方案。没有经过严格测试,只是为了让您知道。

#!/bin/bash
while read filename; do
   CHECK=""
   CHECK=$(awk 'BEGIN{FS="\n";RS=""} $1~/_atom_site_fract_z/ && $2~/#END/' $filename)
   if [ -z "$CHECK" ]; then
      echo $filename > new_files.txt
   fi
done < files.txt
于 2013-01-14T23:46:22.273 回答