我正在尝试处理大量文本文件。这些文本文件包含以下两个连续行之一:
“_ 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”之前。
答案 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