0

1つのファイルがあるとしますabc.csv.dat

100000114,AU79 Attract Mens Deo 150 Ml Can,100000113,AU79 Attract Mens Deo 150 Ml Can,18,_,18,Deo
100000115,AU79 Sauve Mens Deo 150 Ml Can,100000112,AU79 Sauve Mens Deo 150 Ml Can,18,_,18,Deo
100000117,AU79 Altitude Mens Deo 150 Ml Can,100000116,AU79 Altitude Mens Deo 150 Ml Can,18,_,18,Deo
100000119,DU AU79 Bandit Mens Deo 150 Ml Can,100000118,DU AU79 Bandit Mens Deo 150 Ml Can,18,_,18,Deo

2番目のファイルはxyz.csv.dat

100000114,AU79 Attract Mens Deo 250 Ml Can,100000113,AU79 Attract Mens Deo 250 Ml Can,18,_,18,Deo
100000115,AU79 Sauve Mens Deo 150 Ml Can,100000112,AU79 Sauve Mens Deo 150 Ml Can,18,_,18,Deo
100000119,DU AU79 Bandit Mens Deo 150 Ml Can,100000118,DU AU79 Bandit Mens Deo 150 Ml Can,18,_,18,Deo
100000120,AU79 Altitude Mens Deo 350 Ml Can,100000116,AU79 Altitude Mens Deo 350 Ml Can,18,_,18,Deo

UNIX コマンドを使用してこれら 2 つのファイルを比較し、新しい行、更新された行、および削除された行をカウントする UNIX シェル スクリプトを作成します。サンプル ファイルは小さいですが、実際のファイルには 20,000 件以上のレコードが含まれています。

ご清聴ありがとうございました。

4

2 に答える 2

3

comm必要なもののほとんどを取得するために使用できます。「更新」を「削除して挿入」として扱います。

挿入:comm -13 abc.csv.dat xyz.csv.dat
削除:comm -23 abc.csv.dat xyz.csv.dat
変更なし:comm -12 abc.csv.dat xyz.csv.dat

comm では、入力ファイルをソートする必要があります。

于 2013-09-23T12:21:27.743 に答える
0

以下は、comm を使用したより詳細な例です。

$ comm -3 <(sort abc.csv.dat) <(sort xyz.csv.dat) | sed -e 's/^[ \t]*//' | awk -F , '{if (a[$1]) {print "^"$1","} {a[$1] = $0}}' > data2.txt

--更新された行数:

$ cat data2.txt | grep -E -f - xyz.csv.dat | wc -l
1

-- 削除された行数:

$ cat data2.txt | grep -v -E -f - <(comm -2 -3 <(sort abc.csv.dat) <(sort xyz.csv.dat)) | wc -l
1

-- 新しい行を数えます:

$ cat data2.txt | grep -v -E -f - <(comm -1 -3 <(sort abc.csv.dat) <(sort xyz.csv.dat)) | wc -l
1

-- 更新行をリストします。

$ cat data2.txt | grep -E -f - xyz.csv.dat
100000114,AU79 Attract Mens Deo 250 Ml Can,100000113,AU79 Attract Mens Deo 250 Ml Can,18,_,18,Deo

-- 削除行をリストします。

$ cat data2.txt | grep -v -E -f - <(comm -2 -3 <(sort abc.csv.dat) <(sort xyz.csv.dat))
100000117,AU79 Altitude Mens Deo 150 Ml Can,100000116,AU79 Altitude Mens Deo 150 Ml Can,18,_,18,Deo

-- 新しい行をリストします。

$ cat data2.txt | grep -v -E -f - <(comm -1 -3 <(sort abc.csv.dat) <(sort xyz.csv.dat))
100000120,AU79 Altitude Mens Deo 350 Ml Can,100000116,AU79 Altitude Mens Deo 350 Ml Can,18,_,18,Deo
于 2013-10-24T21:26:46.473 に答える