계정.txt

계정.txt

"account.txt"와 "customer.txt"라는 두 개의 텍스트 파일이 있습니다.

**account.txt**

876251251
716126181
888281211
666615211
787878787
111212134

**customer.txt**

876251251
716126181
792342108
792332668
666615211
760332429
791952441
676702288

"account.txt"를 "customer.txt"와 비교해야 합니다.

  • 모든 계좌 번호가 파일 account.txt에 있어야 하며 , "계좌 번호"가 누락된 경우 누락된 모든 계좌 번호를 인쇄해야 합니다 .customer.txtcustomer.txtcustomer.txt
  • 그리고 이러한 추가 고객 번호는 모두 파일 customer.txt에 없으므로 account.txt인쇄하고 싶습니다.

출력은 다음과 같아야 합니다.

Missing Account Number:
888281211
787878787
111212134

Extra Customer Number:
792342108
792332668
760332429
791952441
676702288

리눅스에서 이것이 가능합니까? 이렇게 시작했는데 원하는 첫 번째 경우에만 작동하고 두 번째 경우에는 작동하지 않나요? 또한 위 형식으로 출력을 인쇄해야 합니다.

comm -23 account.txt customer.txt

노트:이러한 파일에는 일부 문자열이나 빈 줄이 있을 수 있으므로 문자열이나 빈 줄이 있으면 비교에서 이를 버려야 합니다. 중요한 숫자만 비교하면 됩니다.

답변1

또 다른 간단한 옵션은 comm; 정렬된 입력만 필요하므로 "유효한 계좌 번호"(전체 행에 9자리 숫자만 포함)를 필터링하여 깨끗한 입력을 제공한 다음 새 파일로 리디렉션하기 전에 이를 sorted로 파이프하는 것입니다.

grep -Ex '[[:digit:]]{9}' account.txt   | sort > account.txt.sorted
grep -Ex '[[:digit:]]{9}' customer.txt  | sort > customer.txt.sorted

...그런 다음 지침에 따라 사용하세요 comm.

{ echo 'Missing Account Number:'; comm -23 account.txt.sorted customer.txt.sorted; }

{ echo 'Extra Customer Number:'; comm -13 account.txt.sorted customer.txt.sorted; }

주어진 샘플 입력:

계정.txt

garbage
876251251
716126181
888281211
666615211
666615211extra
787878787
111212134
extra

클라이언트.txt

garbage
876251251
876251251extra
716126181
792342108
792332668
666615211
760332429
791952441
676702288
junk

결과 출력은 다음과 같습니다.

Missing Account Number:
111212134
787878787
888281211

Extra Customer Number:
676702288
760332429
791952441
792332668
792342108

답변2

예, 가능하며 아마도 가장 쉬운 방법일 것입니다 diff.

$ diff account.txt customer.txt
1c1
< **account.txt**
---
> **customer.txt**
5c5,6
< 888281211
---
> 792342108
> 792332668
7,8c8,10
< 787878787
< 111212134
---
> 760332429
> 791952441
> 676702288

$ diff account.txt customer.txt|grep '^<'
< **account.txt**
< 888281211
< 787878787
< 111212134

$ diff account.txt customer.txt|grep '^>'
> **customer.txt**
> 792342108
> 792332668
> 760332429
> 791952441
> 676702288

아래 쉘스크립트가 diff-script더 완벽합니다.

#!/bin/bash

# assuming 9-digit account and customer numbers

sort account.txt  | uniq > account.srt
sort customer.txt | uniq > customer.srt

diff account.srt customer.srt > diff.txt

echo 'only in account.srt:' > result.txt
< diff.txt grep -E '^< [0-9]{9}$' | sed s'/^< //' >> result.txt

echo 'only in customer.srt:' >> result.txt
< diff.txt grep -E '^> [0-9]{9}$' | sed s'/^> //' >> result.txt

echo "The result is in the file 'result.txt'"
echo "You can read it with 'less result.txt'"

데모 예시,

$ ./diff-script
The result is in the file 'result.txt'
You can read it with 'less result.txt'

$ cat result.txt 
only in account.srt:
111212134
787878787
888281211
only in customer.srt:
676702288
760332429
791952441
792332668
792342108

답변3

이 직업에서는 awk를 선택하겠습니다. 다음 코드는 행에 있는 9자리 숫자의 유효한 데이터로만 실행됩니다. 빈 줄, 9보다 크거나 작은 숫자가 있는 줄, 문자가 포함된 줄은 무시됩니다.

$ cat account
876251251

716126181
888281211
asdferfggggg
666615211
787878787
123456789123
111212134

$ cat customer
876251251
716126181
eeeeeeeee
792342108
792332668
666615211
760332429

791952441
676702288

$ awk '/^[0-9]{9}$/{a[$0]++;b[$0]="found only in " FILENAME}END{for (i in a) if (a[i]==1) print i,b[i]}' account customer |sort -k2
111212134 found only in account
787878787 found only in account
888281211 found only in account
676702288 found only in customer
760332429 found only in customer
791952441 found only in customer
792332668 found only in customer
792342108 found only in customer

관련 정보