첫 번째 열을 기준으로 두 파일을 비교합니다.

첫 번째 열을 기준으로 두 파일을 비교합니다.

두 개의 파일이 있는데 첫 번째 파일의 줄만 포함하고 두 번째 파일은 포함하지 않는 새 파일을 가져오고 싶습니다. 예:

파일 1:

ID      firstname        lastname
1       John             Wilkens
2       Andrea           Smith
3       Matthew          Freberg
4       Brenda           Something

파일 2:

ID      firstname        lastname
1       John             Wilkens
2       Andrea           Willems
3       Jay              Freberg
5       Mike             Hart

산출:

ID      firstname        lastname
4       Brenda           Something

comm을 사용해 보았으나 ID 2와 3처럼 변경된 행도 표시됩니다.

이 문제를 해결하는 데 도움을 주실 수 있나요?

답변1

$ awk 'NR==FNR{a[$1]; next} FNR==1 || !($1 in a)' file2 file1
ID      firstname        lastname
4       Brenda           Something
  • NR==FNR{a[$1]; next}첫 번째 열을 사용하여 file2배열 키 작성
    • NR지금까지 읽은 총 레코드 수를 추적하여 FNR현재 읽고 있는 파일의 레코드 번호만 기록합니다. 따라서 NR==FNR첫 번째 파일에 대해서만 작동합니다(비어 있지 않다고 가정).
  • FNR==1 || !($1 in a)파일 의 경우 file1헤더 행을 인쇄하거나 배열에서 첫 번째 열을 찾을 수 없는 경우a
  • awk -F'\t' '...'입력이 탭으로 구분되고 awk -F, '...'쉼표로 구분된 경우 사용합니다.

첫 번째 파일이 비어 있을 수 있는 경우 다음을 사용하십시오.

awk '!f{a[$1]; next} FNR==1 || !($1 in a)' file2 f=1 file1

그러면 f두 파일 사이에 플래그가 설정됩니다.

답변2

Bash 명령줄에서 다음을 수행할 수 있습니다. file2에서 ID를 필터링하고 file1에서 찾으십시오. 단, 줄의 시작 부분에서만 찾으십시오.

$ grep -vf <(< file2 tail -n+2 | grep -Eo '^[^ ]{1,}'|sed 's/.*/^& /') file1
ID      firstname        lastname
4       Brenda           Something

관련 정보