첫 번째 열을 기준으로 2개의 파일을 비교하고 일치하지 않는 파일을 인쇄합니다.

첫 번째 열을 기준으로 2개의 파일을 비교하고 일치하지 않는 파일을 인쇄합니다.

파일 1:

test1,1
test2,2
test3

문서 #2:

test2
test1
test4

원하는 출력:

test4

답변1

다음을 위해 사용할 수 있습니다 grep:

$ grep -vwf <(cut -d, -f1 file1) file2
test4

설명하다

  • grep옵션:

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    -w, --word-regexp
          Select  only  those  lines  containing  matches  that form 
          whole words.  
    -f FILE, --file=FILE
          Obtain patterns from FILE, one per line.  
    

    따라서 결합된 grep -vwf patternFile inputFile것은 "inputFile에서 전체 단어로 나타나지 않는 패턴파일의 행을 찾는 것"을 의미합니다.

  • <(command): 이를 프로세스 교체라고 하며 이를 지원하는 셸(예: bash)에서는 기본적으로 파일처럼 작동합니다. 이를 통해 명령 출력을 cutgrep options 의 "파일" 로 사용할 수 있습니다 -f.

  • cut -d, -f1 file1:file1의 첫 번째 쉼표로 구분된 필드만 인쇄합니다.

데이터가 실제로 표시된 것과 같은 경우 -x에만 사용하는 대신(전체 행과 일치)을 사용하고 싶을 수도 있습니다 .-w

  -x, --line-regexp
          Select  only  those  matches  that exactly match the whole line.

그래서:

$ grep -vxf <(cut -d, -f1 file1) file2
test4

또한 file1정규식 문자( 등)를 포함할 수 있는 .경우 *다음 ?을 사용할 수도 있습니다 -F.

  -F, --fixed-strings
          Interpret PATTERNS as fixed strings, not regular expressions.

그래서:

$ grep -Fvxf <(cut -d, -f1 file1) file2
test4

답변2

사용 cutgrep:

grep -F -x -v -f <(cut -d',' -f1 file1) file2

cut -d',' -f1 file1첫 번째 필드를 인쇄 file1하고 grep출력을 패턴 입력 파일로 사용합니다(옵션 -f). 옵션 -F은 고정 문자열과 전체 행을 일치시키고 일치를 반전시키는 -x데 사용됩니다 .-v

답변3

:~$ cat > toto
a b
c d
e f
:~$ cat > titi
a b
d e
f g
:~$ awk 'NR==FNR{c[$1]++;next};c[$1] == 0' toto titi
d e
f g

이것은 여러분의 요구 사항을 해결하는 데 사용할 수 있는 예제 목록에서 가져온 예제일 뿐입니다.

답변4

이 설정의 경우

grep -ffile2 -v file1
test3

할 것입니다. 다만, 오탐지 등의 경우에는 추가적인 조치가 필요한 경우가 있으니 주의하시기 바랍니다.

관련 정보