두 파일을 한 줄씩 일치시키시겠습니까? [폐쇄]

두 파일을 한 줄씩 일치시키시겠습니까? [폐쇄]

숫자로 구성된 두 개의 파일이 있습니다. 이제 첫 번째 파일의 줄을 두 번째 파일의 모든 줄과 일치시키고 일치하는 항목이 발견되면 카운터를 증가시키려고 합니다. 이를 위해 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를 다시 읽는 것은 훨씬 덜 효율적이지만 숫자로 다른 작업을 수행하거나 도중에 파일을 조작하려는 경우 이와 같은 루프로 패치하는 것이 더 쉽습니다. 이 -q플래그는 사용되지 않으므로 grep은 자동으로 종료 코드만 반환합니다. 이 코드를 사용하면 일치 항목이 발견되었는지 확인할 수 있으며 일치 항목이 발견된 경우에만 카운터를 증가시킬 수 있습니다.

어느 쪽을 선택하든 일부 행이 다른 숫자의 하위 문자열인 숫자의 일부와 일치할 가능성을 고려해야 합니다. 또한 행당 일치 항목이 여러 개 있는 경우 어떻게 되기를 원하는지 고려해야 합니다. 반복할 때마다 카운터가 증가합니까, 아니면 한 번만 발생합니까? 위의 두 가지 옵션은 이를 다르게 처리한다는 점에 유의하세요! 일부 데이터 세트의 경우 다른 결과를 제공합니다. 동일한 결과를 얻으려면 두 가지 기술을 사용할 수 있습니다. 예를 들어, 첫 번째 항목은 모든 중복 항목이 제거된 파일 버전을 확인할 수 있으므로 두 번 이상 일치하는 항목은 없습니다.

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

관련 정보