![Shell은 두 목록을 비교하고 세 번째 목록의 차이점을 인쇄합니다.](https://linux55.com/image/105378/Shell%EC%9D%80%20%EB%91%90%20%EB%AA%A9%EB%A1%9D%EC%9D%84%20%EB%B9%84%EA%B5%90%ED%95%98%EA%B3%A0%20%EC%84%B8%20%EB%B2%88%EC%A7%B8%20%EB%AA%A9%EB%A1%9D%EC%9D%98%20%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%A9%EB%8B%88%EB%8B%A4..png)
a.txt와 b.txt라는 두 개의 텍스트 파일이 있습니다.
a.txt
1
2
3
4
5
b.txt
3
5
일치하는 숫자는 "0"으로 인쇄되고 일치하지 않는 숫자는 "1"로 인쇄되는 c.txt를 원합니다.
1
1
0
1
0
나는 comm이 줄만 억제/인쇄할 수 있다는 것을 알고 있지만 위의 c.txt를 어떻게 얻을 수 있습니까?
매우 감사합니다.
답변1
diff
참여하지 않고 혼합하고 싶다면 여기에 또 다른 옵션이 있습니다.
sdiff -l a.txt b.txt | sed -e 's/.*<.*/1/' -e 's/.*(.*/0/'
sed
거기에서 더 나은 표현을 얻거나 다음을 사용하여 변경할 수도 있지만 awk
이는 빠른 샷이므로 다음으로 리디렉션하면 됩니다.c.txt
답변2
don_crissti가 지적했듯이 awk
매우 간단합니다.
awk 'FNR==NR { match_nmbrs[$1]++; next;}
{if($1 in match_nmbrs)
print 0;
else
print 1; }
' b.txt a.txt
첫 번째 {...}
조건은 첫 번째 파일의 레코드에만 적용되고, 두 번째 {...}
조건은 두 번째 파일의 레코드에만 적용됩니다. 제 생각에는 다른 모든 것은 설명이 필요합니다.
답변3
awk
출력 시 사용 comm
:
$ comm a.txt b.txt | awk -F'\t' '$1 || $2 { print 1 } $3 { print 0 }'
comm
탭으로 구분된 세 개의 열을 출력합니다.
- 첫 번째 파일의 줄만,
- 두 번째 파일의 줄만
- 해당 행은 두 파일 모두에 존재합니다.
스크립트 awk
는 처음 두 열에 항목이 포함된 모든 입력을 "일치 없음"으로 분류하여 출력하고 , 세 번째 열에 항목이 포함된 경우 일치 항목을 1
출력합니다 .0
comm
두 파일을 모두 정렬해야 합니다 .
답변4
여기 또 다른 awk
해결책이 있습니다
awk '1,$0=system("grep -qx "$1" b.txt")' a.txt