awk를 사용하여 두 파일의 열 정렬

awk를 사용하여 두 파일의 열 정렬

두 개의 입력 파일이 있습니다

28a39a289906c01159f999a68996091a [email protected]
274d1d2c7e931fb55ac0c91dd41f2be7 [email protected]
44d25d3b1b70b240d5058f1be1cef576 [email protected]
2227a768f6d253b7bf81bb4ecb15b52d [email protected]

그리고

28a39a289906c01159f999a68996091a
274d1d2c7e931fb55ac0c91dd41f2be7
44d25d3b1b70b240d5058f1be1cef576
2227a768f6d253b7bf81bb4ecb15b52d

파일 2의 파일 1과 일치하는 열 1이 있는 파일 1의 모든 행을 제외하려고 합니다.

md5 억제.

내가 찾을 수 있는 건awk 'NR==FNR{a[$1]=$0;next}{print a[$2]}' $1 $2

나는 그것이 꽤 가깝다는 것을 알고 있지만 내가 지금하고 싶은 일을하기 전에 내가 무엇을했는지 잘 모르겠습니다.

답변1

순서가 중요하지 않고(예: 파일에 md5가 포함된 모든 이메일 제외) awk가 마음에 들지 않으면 다음을 사용하세요.join:

join -v 1 -j 1 <(sort emails) <(sort excludes)

-v 1두 번째 파일(제외)에 해당 줄이 없는 첫 번째 파일(이메일)의 줄을 인쇄하도록 지시합니다.
-j 1 각각의 첫 번째 열만 보도록 지시합니다.


awk를 사용하려면 다음이 작동해야 한다고 생각합니다.

awk 'NF==1{exclude[$1]++} NF==2&&!exclude[$1]' excludes emails

또는 두 파일이 한 줄씩 일치하고 라인 2만 제외하려는 경우(예: 두 파일 모두 해당 특정 라인에 동일한 해시가 있는 경우) 다음을 사용하십시오.

awk 'NF==1{hash[FNR]=$1} NF==2&&hash[FNR]!=$1' excludes emails

답변2

이것의 장점은 파일을 어떤 순서로든 정렬할 수 있다는 것입니다.

sort file1 file2 | uniq -u --check-chars 32 | grep -E '.{33}'

sort file1 file2uniq를 준비하기 위해 파일을 결합하고 정렬하는 중입니다.

uniq -u --check-chars 32처음 32자만 고려되며, 사용 시 -u고유한 줄만 인쇄됩니다.

grep -E '.{33}'33자 이상의 문자가 포함된 행만 인쇄됩니다.

편집하다

Peter.O가 지적했듯이 이것은진행되지 않았다파일 목록에 있는 두 개 이상의 항목이 동일한 md5를 갖는 상황입니다. 이 경우 해당 파일은 인쇄되지 않습니다. 나는 join이 솔루션을 가장 좋아합니다.

그러나 이 논리는고유한 md5가 있는 모든 개별 파일에 따라 다름, 이는 이 출력의 사용에 따라 잘못된 가정입니다. 다음은 md5sum 로직을 사용하는 백업 스크립트의 예입니다. 내 솔루션과 달리 논리가 fileA와 fileB를 올바르게 식별 하지만 join여전히 문제가 있습니다.

echo "hello world" > fileA
cp fileA fileB
./backup_script.sh
cp fileA fileC
./backup_script.sh

이 작업을 수행하려면 fileC의 백업이 필요합니까?

답변3

다음 명령이 작동해야 합니다.

awk '
  NR==FNR {
    a[$1]=$0;
    next
  }
  { if ( a[$1] ) delete a[$1] } 
  END { 
    for ( md5 in a ) { 
      if ( a[md5] ) { print a[md5] } 
    } 
  }
' file1 file2

관련 정보