파일 1의 모든 레코드를 인쇄하고 파일 2와 일치하지 않는 레코드를 기록하려면 어떻게 해야 합니까?

파일 1의 모든 레코드를 인쇄하고 파일 2와 일치하지 않는 레코드를 기록하려면 어떻게 해야 합니까?

a의 모든 행을 인쇄하는 간단한 방법이 있습니까 file1(출력이 입력과 동일한 수의 행을 갖도록 ), file1의 첫 번째 항목이 file1의 첫 번째 항목과 일치하지 않는다는 file1메시지를 인쇄합니까 ?NoMatchfile2

파일 1:

Entry1 Entry2
a 2
b 3
c 4
d 5

파일 2:

a
b
b
a
d
d

원하는 출력:

Entry1
a 2
b 3
NoMatch 4
d 5

나는 노력하고있다

join -a1 -e "NoMatch" -11 -21 -o2.1 file1 file2

file1일치하지 않는 일치하지 않는 행을 유지 file2하고 이러한 경우에 "아니요" 메시지를 표시 하고 싶지만 이는 내 모든 기록 file2(중복 항목 포함)도 유지하기 때문에 내가 뭘 잘못하고 있는 걸까요? 두 번째 파일이 탭으로 구분되어 있고 첫 번째 파일이 공백으로 구분되어 있기 때문일 수 있나요?

모든 도움에 진심으로 감사드립니다...

답변1

awk먼저 읽고 file2저장 한 $1다음 seen[$1]읽습니다 file1. "본" 것이 아닌 경우 $1다음으로 바꿉니다 NoMatch.

awk 'FNR==NR{seen[$1]++; next}
{(FNR==1 || ($1 in seen)) || $1="NoMatch"};1' file2 file1

원하는 경우 입력을 정렬해야 합니다 join. 먼저 head나머지 행에서 er를 추출한 file1다음 ed를 사용하여 결과를 추출해야 합니다.sortjoinsortfile2

{ head -n1; sort | join -j1 -a1 -e "NoMatch" -o 2.1 1.2 - <(sort file2); } <file1

필요한 경우 uniq중복 행을 피하기 위해 모든 항목을 파이프합니다.

{ head -n 1; sort | \
join -j1 -a1 -e "NoMatch" -o 2.1 1.2 - <(sort file2) | \
uniq; } <file1

관련 정보