「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.txt
customer.txt
customer.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