有条件地打印bash

时间:2013-01-14 23:01:53

标签: string bash shell scripting

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

“_ 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”之前。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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