シェルスクリプトでデータに一致する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
コードを記述しましたが、機能しませんでした。記述方法は?
コメント
回答
2つかどうかをテストするだけファイルは同じです。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
の終了ステータスはゼロになります。これは、上記のコードで2つのファイルが同一であるかどうかに関するメッセージを出力するために使用されます。
2つの入力ファイルにファイルのパス名のリストが含まれている場合比較したい場合は、次のような二重ループを使用します。
ここでは、結果は端末とファイルfile-comparison.out
の両方で生成されます。
2つの入力ファイルのパス名に改行が埋め込まれていないことを前提としています。
コードは最初に、ファイルの1つからすべてのパス名を配列files1
、mapfile
を使用します。他のファイルの各パス名のすべてのパス名を調べる必要があるため、このファイルを複数回読み取る必要がないようにこれを行います。内側のループで$filelist1
から読み取る代わりに、files1
配列の名前を繰り返し処理していることに気付くでしょう。
コメント
- bashシェルで完全なプログラムが必要です
- @santhoshreddy更新された回答を参照してください。
回答
最も簡単な方法はコマンドdiff
を使用することです。
例:
最初のファイルがfile1.txt
には、次のものが含まれています。
I need to buy apples. I need to run the laundry. I need to wash the dog. I need to get the car detailed.`
および2番目のファイルfile2.txt
I need to buy apples. I need to do the laundry. I need to wash the car. I need to get the dog detailed.
次に、diffを使用して、次のコマンドで2つのファイル間でどの行が異なるかを自動的に表示できます。
diff file1.txt file2.txt
出力は次のようになります。
2,4c2,4 < I need to run the laundry. < I need to wash the dog. < I need to get the car detailed. --- > I need to do the laundry > I need to wash the car. > I need to get the dog detailed.
この出力の意味を見てみましょう。覚えておくべき重要なことは、diffがこれらの違いを説明するとき、それは規範的な文脈でそれを行うということです。つまり、最初のファイルを変更して2番目のファイルと一致させる方法を示します。差分出力の最初の行には、次のものが含まれます。
- 最初のファイルに対応する行番号
- 文字(追加の場合はa、変更の場合はc、削除の場合はd) )
- 2番目のファイルに対応する行番号。
上記の出力では、 “2,4c2,4 「は、「行 2 から 4 は行に一致するように変更する必要があります 2 から 4 。次に、これらの行が各ファイルに含まれていることを示します。
- <が前に付いている行は最初のファイルの行です。
- の前の行は、2番目のファイルの行です。
- 3つのダッシュ( “—“)は、ファイル1とファイル2の行を区切るだけです。
回答
これは純粋なものですファイルを比較するためのbashシェルスクリプト:
#!/usr/bin/env bash # @(#) s1 Demonstrate rudimentary diff using shell only. # Infrastructure details, environment, debug commands for forum posts. # Uncomment export command to run as external user: not context, pass-fail. # export PATH="/usr/local/bin:/usr/bin:/bin" set +o nounset LC_ALL=C ; LANG=C ; export LC_ALL LANG pe() { for _i;do printf "%s" "$_i";done; printf "\n"; } pl() { pe;pe "-----" ;pe "$*"; } db() { ( printf " db, ";for _i;do printf "%s" "$_i";done;printf "\n" ) >&2 ; } db() { : ; } C=$HOME/bin/context && [ -f "$C" ] && $C set -o nounset FILE1=${1-data1} shift FILE2=${1-data2} # Display samples of data files. pl " Data files:" head "$FILE1" "$FILE2" # Set file descriptors. exec 3<"$FILE1" exec 4<"$FILE2" # Code based on: # http://www.linuxjournal.com/content/reading-multiple-files-bash # Section 2, solution. pl " Results:" eof1=0 eof2=0 count1=0 count2=0 while [[ $eof1 -eq 0 || $eof2 -eq 0 ]] do if read a <&3; then let count1++ # printf "%s, line %d: %s\n" $FILE1 $count1 "$a" else eof1=1 fi if read b <&4; then let count2++ # printf "%s, line %d: %s\n" $FILE2 $count2 "$b" else eof2=1 fi if [ "$a" != "$b" ] then echo " File $FILE1 and $FILE2 differ at lines $count1, $count2:" pe "$a" pe "$b" # exit 1 fi done exit 0
生成:
$ ./s1 Environment: LC_ALL = C, LANG = C (Versions displayed with local utility "version") OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64 Distribution : Debian 8.9 (jessie) bash GNU bash 4.3.30 ----- Data files: ==> data1 <== I need to buy apples. I need to run the laundry. I need to wash the dog. I need to get the car detailed. ==> data2 <== I need to buy apples. I need to do the laundry. I need to wash the car. I need to get the dog detailed. ----- Results: File data1 and data2 differ at lines 2, 2: I need to run the laundry. I need to do the laundry. File data1 and data2 differ at lines 3, 3: I need to wash the dog. I need to wash the car. File data1 and data2 differ at lines 4, 4: I need to get the car detailed. I need to get the dog detailed.
コメント特定のコマンドを削除して、最初に表示された違いで終了し、読み取られたすべての行を表示したい場合は、終了できます。
を参照してください。
よろしくお願いします…乾杯、 drl
コメント
-
head
は外部ユーティリティであり、?そして、コメントは上部に何を意味しますか? - ヘッドは入力を表示します。差分ではバラバラになりません。他のいくつかのアイテムと同様に、" context "はローカルで環境コンテキストを表示します。これを含めることで、' OSとユーティリティのバージョンが異なるかどうかを議論する必要がなくなります。
- 気づいてくれてありがとう、エクスポートがありませんでした。
- まだ'コメントを理解していません。'の"外部ユーザー"とは何ですか?また、なぜ設定するのですか? 純粋なスクリプトのパス
bash
? - 当店のコードを記述しているため、外部ユーザーによってパス設定が異なる場合があります。 設定を省略する必要があると思われる場合は、これを追加します。 これは、コードが実行された環境に関する情報を表示するように変更されたテンプレートです。 デモコードではなく、クライアント向けの本番コードに変換する場合は、'ローカルパスが使用されていないことを確認する必要があります。コマンドライン for contextは、そのファイルが見つからない場合、エラーも発生せず、バージョンもリストされないように設計されています。
diff
コマンド?