段落パターンの「パターンファイル」で複数のパターンを一致させる[閉じる]

段落パターンの「パターンファイル」で複数のパターンを一致させる[閉じる]

入力ファイルがあり、段落内で別の一致を検索し、一致がある場合は、段落全体を含む出力ファイルに移動する必要があります。

1つの重要な点は、出力順序が入力順序を反映する必要があることです。だから段落を検索する必要があります。みんなパターンマッチングファイルのパターン(1行に1つのパターン)、そして一つパターンの一致 該当する段落の追加一致を停止し、一致する段落を出力ファイルに移動し、次の段落に処理をスキップします。

入力ファイル:

DFJKHDKQW
YYYYYYYYYYYY
SDFLKJHSDKLFH

DSFLKHSDLKFH
DFIHERFW
ADFKJH
OIGHRFGH
XXXXXXXXXXXX
SDKFLJH

DFLKHSDFKLH
SDSDJKLFHSDK

OIHGSDFG
AAAAAAAA
LFKHFGJKDGH
KLJHLUG

DFSDKLF
YYYYYYYYYYYY

パターンマッチファイル:

AAAAAAAA
YYYYYYYYYYYY
XXXXXXXXXXXX

予想出力:

DFJKHDKQW
YYYYYYYYYYYY
SDFLKJHSDKLFH

DSFLKHSDLKFH
DFIHERFW
ADFKJH
OIGHRFGH
XXXXXXXXXXXX
SDKFLJH

OIHGSDFG
AAAAAAAA
LFKHFGJKDGH
KLJHLUG

DFSDKLF
YYYYYYYYYYYY

awk私は今想像を超えた一連の問題に直面しています。

  1. 入力ファイルを使用したパターンの一致
  2. 最初に表示されたときに段落を回転し、「次の段落に停止/ジャンプ」
  3. 一致する段落を出力ファイルにコピーします。
  4. 入力から一致する段落を削除します(diff後で2つのファイル間でこれを行うことができるので、オプション)。

ベストアンサー1

完全な行文字列の一致を実行すると仮定すると、次のものが必要です。

$ cat tst.awk
BEGIN {
    ORS = "\n\n"
    FS = "\n"
}
NR==FNR {
    tgts[$0]
    next
}
{
    out = "unmatched"
    for (i=1; i<=NF; i++) {
        if ($i in tgts) {
            out = "matched"
            break
        }
    }
    print > out
}

$ awk -f tst.awk targets RS= file

$ ls *matched
matched  unmatched

$ head -100 *matched
==> matched <==
DFJKHDKQW
YYYYYYYYYYYY
SDFLKJHSDKLFH

DSFLKHSDLKFH
DFIHERFW
ADFKJH
OIGHRFGH
XXXXXXXXXXXX
SDKFLJH

OIHGSDFG
AAAAAAAA
LFKHFGJKDGH
KLJHLUG

DFSDKLF
YYYYYYYYYYYY


==> unmatched <==
DFLKHSDFKLH
SDSDJKLFHSDK

文字列一致ではなく正規表現を実行する必要がある場合、または正確に一致するのではなく部分を実行する必要がある場合は、別の解決策が必要です(そして、要件をよりよく説明するために質問を更新してください)。

おすすめ記事