저는 현재 일치하지 않는 패턴을 찾는 대용량 파일을 작업 중입니다. 나는 이것을 달성하기 위해 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
및 ).ba
aba
더미 데이터에 대한 테스트:
$ 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의 답변보다 느려야 합니다.모두패턴의 발생 횟수입니다.