Shell은 두 목록을 비교하고 세 번째 목록의 차이점을 인쇄합니다.

Shell은 두 목록을 비교하고 세 번째 목록의 차이점을 인쇄합니다.

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탭으로 구분된 세 개의 열을 출력합니다.

  1. 첫 번째 파일의 줄만,
  2. 두 번째 파일의 줄만
  3. 해당 행은 두 파일 모두에 존재합니다.

스크립트 awk는 처음 두 열에 항목이 포함된 모든 입력을 "일치 없음"으로 분류하여 출력하고 , 세 번째 열에 항목이 포함된 경우 일치 항목을 1출력합니다 .0

comm두 파일을 모두 정렬해야 합니다 .

답변4

여기 또 다른 awk해결책이 있습니다

awk '1,$0=system("grep -qx "$1" b.txt")' a.txt

관련 정보