주어진 입력을 사용하여 다음 출력을 얻으려고합니다. 명령을 통해 수행 할 수 있습니까 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.1
d_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