두 개의 입력 파일이 있습니다
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 file2
uniq를 준비하기 위해 파일을 결합하고 정렬하는 중입니다.
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