シェルスクリプトの2つのファイルで一致するデータを見つけ、シェルの他のファイルに保存されている重複データを見つける方法は?
#!/bin/bash
file1="/home/vekomy/santhosh/bigfiles.txt"
file2="/home/vekomy/santhosh/bigfile2.txt"
while read -r $file1; do
while read -r $file2 ;do
if [$file1==$file2] ; then
echo "two files are same"
else
echo "two files content different"
fi
done
done
コードを書きましたが、うまくいきませんでした。どのように書くのですか?
ベストアンサー1
両方のファイルが同じであることをテストするには、次のようにしますcmp -s
。
#!/bin/bash
file1="/home/vekomy/santhosh/bigfiles.txt"
file2="/home/vekomy/santhosh/bigfile2.txt"
if cmp -s "$file1" "$file2"; then
printf 'The file "%s" is the same as "%s"\n' "$file1" "$file2"
else
printf 'The file "%s" is different from "%s"\n' "$file1" "$file2"
fi
ユーティリティを「サイレント」にする-s
フラグを指定します。cmp
2つの同じファイルを比較すると、終了ステータスはcmp
0になります。上記のコードでは、両方のファイルが同じかどうかに関するメッセージを印刷するために使用されます。
2つの入力ファイルがある場合パス名のリストが含まれています。比較するファイルを選択し、次の二重ループを使用します。
#!/bin/bash
filelist1="/home/vekomy/santhosh/bigfiles.txt"
filelist2="/home/vekomy/santhosh/bigfile2.txt"
mapfile -t files1 <"$filelist1"
while IFS= read -r file2; do
for file1 in "${files1[@]}"; do
if cmp -s "$file1" "$file2"; then
printf 'The file "%s" is the same as "%s"\n' "$file1" "$file2"
fi
done
done <"$filelist2" | tee file-comparison.out
ここで結果は端末とファイルの両方で生成されますfile-comparison.out
。
両方の入力ファイルのパス名に改行文字が含まれていないとします。
files1
コードは、ファイルの1つのすべてのパス名を配列として読み取ることから始まりますmapfile
。他のファイルの各パス名のすべてのパス名を繰り返す必要があるため、ファイルを何度も読み取らないようにします。$filelist1
内部ループから読み取るのではなく、配列の名前を繰り返していることがわかりますfiles1
。