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