두 파일을 한 줄씩 일치시킵니까?

두 파일을 한 줄씩 일치시킵니까?

숫자로 구성된 두 개의 파일이 있습니다. 이제 첫 번째 파일의 줄을 두 번째 파일의 모든 줄과 일치시키고 일치하는 항목이 발견되면 카운터를 늘리고 싶습니다. 이를 위해 bash 스크립트를 작성하는 방법은 무엇입니까?

file1:
1
2
3
4
5
6
file2:
2
3
6
10
12
13
23
counter = 3

답변1

다음과 같은 숫자 세트를 가정 file1.txt하고 갖습니다.file2.txt

file1.txt:

1
2
4
6
7

file2.txt:

2
6
7
8
9

데이터로 무엇을 하려는지 또는 그 외에 무엇을 수집하고 싶은지에 따라 몇 가지 접근 방식을 시도해 볼 수 있습니다.

  • Grep은 파일에서 패턴 문자열을 검색할 수 있습니다. 플래그를 사용하여 다른 파일을 사용하여 패턴을 제공할 수 있습니다 -f. 또한 플래그 -x는 '2' 패턴이 '24'와 일치하지 않도록 전체 줄 일치만 찾도록 합니다. 마지막으로 -c플래그는 일치하는 횟수를 계산합니다. 모두 합치면 다음과 같습니다.

    grep -x -c -f file1.txt file2.txt
    
  • 총 개수를 얻는 다른 방법으로 숫자를 사용하여 다른 작업을 수행하려면 보다 수동적인 접근 방식을 사용할 수 있습니다.

    counter=0
    while read number; do
        grep -q -x "$number" file2.txt && let counter=$counter+1
    done < file1.txt
    echo $counter
    

    file1.txt의 모든 행에 대해 file2.txt를 다시 읽으므로 이는 훨씬 덜 효율적이지만 숫자로 다른 작업을 수행하거나 도중에 파일을 조작하려는 경우 다음과 같은 루프에 패치하는 것이 더 쉬울 것입니다. 저것. 플래그를 사용하지 않으므로 -qgrep은 자동으로 종료 코드만 반환합니다. 해당 코드를 사용하면 일치 항목이 발견되었는지 여부를 알 수 있으며 일치하는 경우에만 카운터를 증가시킬 수 있습니다.

어떤 방식으로든 일부 행이 다른 숫자의 하위 문자열인 숫자와 부분적으로 일치할 가능성을 고려해야 합니다. 또한 한 줄에 두 개 이상의 일치 항목이 있는 경우 어떻게 되기를 원하는지 생각해야 합니다. 각 중복이 카운터를 증가시키나요, 아니면 한 번만 발생합니까? 위의 두 가지 옵션은 이를 다르게 처리합니다! 일부 데이터 세트의 경우 다른 결과가 나타납니다. 동일한 결과를 얻기를 원한다면 두 기술을 모두 적용할 수 있습니다. 예를 들어 첫 번째 항목은 모든 중복 항목이 제거된 파일 버전을 확인하여 두 번 이상 일치하는 항목이 없도록 할 수 있습니다.

 grep -x -c -f <(sort -u file1.txt) <(sort -u file2.txt)

관련 정보