sed 및 awk와 일치하는 grep 문자열과 동일 [닫기]

sed 및 awk와 일치하는 grep 문자열과 동일 [닫기]

저는 현재 일치하지 않는 패턴을 찾는 대용량 파일을 작업 중입니다. 나는 이것을 달성하기 위해 grep을 사용하고 있습니다. 어떤 이유로 grep은 잠재적인 불일치 패턴을 무시/제외합니다. 패턴 파일과 문자열 파일은 모두 16진수 문자로 구성됩니다. 대략 200,000개의 패턴이 있으며, 각 패턴의 길이는 12~500자이며, 13,000개의 문자열(각 문자열의 길이는 2,880,560자)입니다. 다음 명령을 사용하고 있습니다.

grep -oFf patterns.txt large_strings.txt | grep -vFf - patterns.txt > unmatched_patterns.txt

위 명령은 먼저 일치하는 패턴을 모두 추출한 후, 일치하는 패턴 중 일치하지 않는 패턴을 텍스트 파일로 저장합니다. 이 작업을 모방하는 데 상응하는 sed 또는 awk 명령이 있습니까? 두 대의 다른 컴퓨터(내 개인 컴퓨터와 클러스터)를 사용하여 위에서 언급한 grep 명령을 시도했는데 결과는 동일했습니다.

실행하여 getconf ARG_MAX클러스터에 대해 다음과 같은 출력을 얻었습니다.

4611686018427387903

일치하지 않는 패턴의 몇 가지 예는 다음과 같습니다.

fffbfefffffefffffffffffefffffffffffefffffffffffefffffffffffefffffffffffefffffffffffefffffffffffefffffefffffefffffefffffefffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffff
1d2a0e1d2a101c290f1b280e1a270d18250b17240a17230b16220a16220a15210915210916220a16220c19220d1b230e1b230e1b230e1c240d1c240d1c240d1c240d1b250c1c260d1c26
fefffffefffffffffffffffffffdfffffffffffdfeff

두 개의 문자열로 구성된 큰 문자열의 예제 파일은 아래 링크에서 찾을 수 있습니다. https://www.mediafire.com/file/b1plp74uztkicyr/large_strings.txt/file

답변1

, 를 사용하여 awk모든 패턴을 연관 배열의 키로 읽습니다. 그런 다음 데이터 파일을 한 줄씩 검사하고 남은 각 패턴을 각 줄에 대해 테스트합니다. 패턴이 일치하면 연관 배열에서 제거됩니다.

마지막으로 일치하지 않는 패턴이 출력됩니다.

NR == FNR { pat[$0] = 1; next }

{
    for (p in pat)
        if (index($0,p) != 0)
            delete pat[p]
}

END {
    for (p in pat)
        print p
}

예를 들어 파일에 저장한 script.awk다음 실행할 수 있습니다.

awk -f script.awk patterns.txt large_strings.txt >unmatched_patterns.txt

이것은 문자열 비교를 수행하기 위해 index()정규식 일치(예: 사용) 대신 를 사용 grep -F하지만 데이터의 겹치는 위치에서 여러 패턴 문자열을 일치시킬 수 있습니다. 제 생각에는 그렇게 하지 않을 것입니다 ( grep패턴 ab및 ).baaba

더미 데이터에 대한 테스트:

$ cat patterns.txt
a
b
c
d
$ cat strings.txt
abba
bull
cooler
$ awk -f script.awk patterns.txt strings.txt
d

d(파일에서 해당 문자열을 찾을 수 없습니다 strings.txt.)

답변2

GNU를 사용하면 grep다음과 같이 할 수 있습니다.

(
  export LC_ALL=C
  sort -uo patterns.txt patterns.txt # if not already uniqued and sorted in the C locale
  grep -oFf patterns.txt large_strings.txt |
    sort -u |
    comm -13 - patterns.txt > unmatched_patterns
)

이론적으로는 다음을 찾기 때문에 @Kusalananda의 답변보다 느려야 합니다.모두패턴의 발생 횟수입니다.

관련 정보