0

大量のテキスト ファイルを処理しようとしています。これらのテキスト ファイルには、次の 2 つの連続した行のいずれかが含まれています。

「_atom_site_fract_z」の後に「#END」が続く

また

「_atom_site_fract_z」の後に「C1 C 0.46450 0.18880 0.92540」などの文字列が続く

bash/sed を使用して、後のタイプのファイル (「_atom_site_fract_z」の後に「#END」が続くファイル) のみを保持したいと考えています。

どうすればこれを達成できますか?

注: 2 つの文字列は NEWLINE で区切られています。それらはスペースで区切られていません。

更新: ファイルの名前はテキスト ファイルに保存されます。テキスト ファイルを 1 行ずつ読み込んで、ファイルを保持する必要があるかどうかを確認します。必ずしもそれらを削除したいわけではありませんが、後のタイプのファイルをディレクトリ内の別のフォルダーに保存したいと考えています。

UPDATE2: この 2 行以外に「その他の行」があります。特定の 2 行の組み合わせを含むファイルを検索したい。すべてのファイルには "_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 に答える