두 파일을 비교하고 첫 번째 열을 무시하고 줄 번호를 인쇄합니다.

두 파일을 비교하고 첫 번째 열을 무시하고 줄 번호를 인쇄합니다.

탭으로 구분된 파일의 첫 번째 열을 무시하고 차등 줄 번호를 인쇄하는 방법은 무엇입니까?

예 - 첫 번째 열을 무시하고 줄 번호를 인쇄하여 파일 1과 파일 2를 비교합니다. 파일 2에 존재하는 차이 레코드의 경우.

파일 1에서:

user1   fistname    Lastnamename
user2   Johnny            Depp
user3   Tom               Cruise
user4   Leonardo          DiCaprio
user5   Sylvester         Stallone

그리고

파일 2에서:

user10   fistname    Lastnamename
user2   Johnny            Depp
user30  Tom'               Cruise
user4   Nicolas           Cage
user50  Sylvester         Stallone

예상 결과:- file2의 차이점은 줄 번호 3,4입니다.

비교할 파일 크기는 GB 단위이며 파일은 탭으로 구분됩니다.

답변1

diff 명령과 cut을 사용하여 두 파일의 차이점을 찾을 수 있습니다.

diff <(cut -f2 -d$'\t' file1) <(cut -f2 -d$'\t' file2)

출력은 다음과 같습니다

3,4c3,4
< Tom
< Leonardo
---
> Tom'
> Nicolas

더 많은 중복 레코드가 걱정된다면 위 명령을 사용하여 sort -u중복 레코드를 제거한 다음 다른 파일과의 차이점을 찾아보세요. 명령은 다음과 같습니다

diff <(cut -f2 -d$'\t' file1|sort -u) <(cut -f2 -d$'\t' file2|sort -u)

답변2

이 코드를 사용해 보았지만 데이터가 충분하지 않아 이것이 작동하는지 모르겠습니다.

diff --unchanged-line-format="" --old-line-format="" --new-line-format=":%dn: %L" file1 file2 | sed 1d | cut -d':' -f2 |tr '\n' ','|sed 's/,$//g'

답변3

이것은 귀하의 질문에 대한 답변이 될 수 있습니다:

awk 'NR==FNR{++a[$2,$3];next} {line++;if(!(a[$2,$3])){print line}}' record1 record2

설명하다:

FNR==NR

두 개 이상의 입력 파일이 있는 경우 awkFNR은 다음 파일의 첫 번째 줄에서 다시 1로 재설정되고 NR은 중단된 위치부터 계속 증가합니다. 확인을 통해 FNR==NR실제로 첫 번째 파일이 현재 구문 분석되고 있는지 확인하고 있습니다.

++a[$2,$3]

첫 번째 파일(위 참조)을 구문 분석하는 경우 첫 번째 필드 $2와 두 번째 필드 $3을 키로 사용하여 연관 배열을 만든 다음 값을 1씩 증가시킵니다. 이를 통해 본질적으로 "표시된" 목록을 만들 수 있습니다.

next

이 명령은 awk에게 더 이상의 명령을 처리하지 말고 다음 레코드를 읽고 다시 시작하라고 지시합니다. file1은 연관 배열을 설정하는 데에만 사용되기 때문에 이렇게 합니다.

!(a[$2,$3])

이 줄은 FNR==NR이 false인 경우에만 실행됩니다. 즉, file1을 구문 분석하지 않으므로 file2를 구문 분석해야 합니다. 그런 다음 file2의 첫 번째 필드 $1과 두 번째 필드 $2를 키로 사용하여 이전에 만든 "본" 목록에 대한 색인을 생성합니다. 반환된 값이 0이면 file1에서 해당 값을 볼 수 없다는 의미이므로 이 줄을 인쇄해야 합니다. 반대로 값이 0이 아니면 file1에서 볼 수 있으므로 해당 값을 인쇄하면 안 됩니다. !(a[$2,$3])는 !(a[$2,$3]){print}와 동일합니다. 지정되지 않은 경우 기본 동작은 전체 줄을 인쇄하는 것이기 때문입니다.

답변4

$ echo -n 'difference in file2 is for line number ';diff --unchanged-line-format="" --old-line-format="" --new-line-format="%dn " <(tail +2 file1|unexpand -a|cut -f2-) <(tail +2 file2|unexpand -a|cut -f2-)|grep -o "[0-9]*" | while read i;do echo $((i+1));done|paste -sd,
difference in file2 is for line number 3,4

관련 정보