アカウント.txt

アカウント.txt

「account.txt」と「customer.txt」という2つのテキストファイルがあります。

**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

Linuxでこれは可能ですか?私はこのように始めましたが、あなたが望む最初のケースでのみ機能し、2番目のケースではうまくいきませんか?また、上記の形式で出力を印刷する必要があります。

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

関連情報