Diff 명령을 사용하여 줄의 텍스트를 무시하고 조건에 따라 일치하지 않는 데이터를 얻는 방법

Diff 명령을 사용하여 줄의 텍스트를 무시하고 조건에 따라 일치하지 않는 데이터를 얻는 방법

주어진 입력을 사용하여 다음 출력을 얻으려고합니다. 명령을 통해 수행 할 수 있습니까 diff? 이 구문을 시도하고 있지만 작동하지 않습니다.

diff -a  --suppress-common-lines a.txt b.txt

다음은 두 개의 입력 파일입니다.

첫 번째 a.txt:

abc abc/d_4.1/efg 35 
xyz abc/d_4.1/efg 36
mno abc/d_4.1/efg 38

그리고 b.txt:

abc abc/d_4/efg 35
xyz abc/d_4/efg 36
mno abc/d_4/efg 40

이 출력이 필요합니다(아래는 두 파일의 출력입니다 diff).d_4.1d_4

mno abc/d_4.1/efg 38
mno abc/d_4/efg  40

답변1

유틸리티에는 diff필드를 건너뛸 수 있는 옵션이 없습니다.

Cut & uniq로 작동시키려고 노력 중입니다. 아래 접근 방식이 작동할 것이라고 생각하지만 출력에서 ​​열 2가 누락됩니다.

$ cut -d/ -f1,3 file1 file2 |sort |uniq -u  #column 2 is skipped

보다 정확한 해결책으로 다음 awk를 제안합니다.

awk -F" |/" '{a=$1$2$4$5;seen[a]++;out[a]=$0}END{for (i in seen) if (seen[i]==1) print out[i]}' file1 file2

주어진 입력 데이터의 각 줄 끝에 추가 공백이 포함되어 있기 때문에 필드 구분 기호 공백 또는 슬래시 /를 사용합니다.

실제 데이터에 추가 공백이 없더라도 위의 솔루션은 여전히 ​​잘 작동합니다.

awk의 논리는 다음과 같습니다. 중간 열( /d_4/)을 건너뛰고 uniq -u를 시뮬레이션합니다.
file1과 file2 사이의 모든 고유 행(awk로 연결됨)만 인쇄합니다.

시험(온라인 테스트도 참조하세요)

cat file1 
cat file2 
echo "awk start:"
awk -F" |/" '{a=$1$2$4$5;seen[a]++;out[a]=$0}END{for (i in seen) if (seen[i]==1) print out[i]}' file1 file2
echo "awk end"

#Output
#file1            
abc abc/d_4.1/efg 35
xyz abc/d_4.1/efg 36 
mno abc/d_4.1/efg 38
#file2
abc abc/d_4/efg 35
xyz abc/d_4/efg 36 
mno abc/d_4/efg 40

awk start:      
mno abc/d_4/efg 40
mno abc/d_4.1/efg 38
awk end

답변2

awk, 및 분할 on 을 사용하면 /이 코드는 첫 번째 필드가 일치하고 세 번째 필드가 일치하지 않을 때 두 줄을 인쇄합니다.

암호:

#!/bin/awk -f
BEGIN { FS = OFS = "/" }

$1 in a2 && $3 != a2[$1] {
    print $1, a1[$1], a2[$1]
    print
}
{
    a1[$1] = $2
    a2[$1] = $3
}

결과:

$ awk -f test.awk file1 file2
mno abc/d_4.1/efg 38
mno abc/d_4/efg 40

관련 정보