2016-04-19 4 views
0

diffを使用して2つのテキストファイルの違いを調べています。それはうまくいっていますが、テキストファイルの行の順序を変更すると、結果ファイルに似たようなテキストが表示されます。なぜdiffユーティリティは結果ファイルに同様のテキストを表示しますか?

>gi40 
CCCCCC 
>gi01 
BBBBBB 
>gi02 
AAAAAA 
>gi30 
BBBBBB 

Result.txt

>gi17 
AAAAAA 
>gi30 
BBBBBB 
>gi40 
CCCCCC 
>gi92 
DDDDDD 
>gi50 
EEEEEE 
>gi81 
FFFFFF 

FILE2.TXT:

>gi17 
AAAAAA 
>gi30  ??? 
BBBBBB  ??? 
>gi92 
DDDDDD 
>gi01 
BBBBBB 
>gi50 
EEEEEE 
>gi81 
FFFFFF 
>gi02 
AAAAAA 
>gi30  ??? 
BBBBBB  ??? 

差分声明:

$ diff C:/Users/User/Desktop/File1.txt C:/Users/User/Desktop/File2.txt > C:/Users/User/Desktop/Result.txt 
ここ

はFILE1.TXTです

それはdefferentとして

>gi30 
BBBBBB 

を表示するのはなぜ?

編集1: 私が欲しいのは二つのファイルが順序付けされていないと私は彼ら(遺伝子データ)を触れることができないので、ファイル全体2内のファイル1内の各ラインの発生を検索することです。

編集2: 私のPHPコードからjoinコマンドを実行します。それはCMDアプリケーションをcygwinの中で正常に実行しかし、それは私のPHPから

shell_exec("C:\\cygwin64\\bin\\bash.exe --login -c 'join -v 1 <(sort $OldDatabaseFile.txt) <(sort $NewDatabaseFile.txt) > $text_files_path/DelSeqGi.txt 2>&1'"); 

を実行しなかったおかげ。

+2

'diff'でも順番に違いをチェックします。 2つのシンプルなファイルを試してみてください。それぞれのファイルの番号は1から5ですが、順序は異なります。 diffはそれらすべてを表示します。 – fedorqui

+0

@fedorqui OMG!オーダーを無視し、whoeファイルのオカレンスを検索する方法はありますか? – sara

+0

@ saraはあらかじめファイルをソートします。 – 123

答えて

0

は、以下のようUTIL joinbashを使用します -

DESCRIPTION 
    The join utility performs an ``equality join'' on the specified files and 
    writes the result to the standard output. The ``join field'' is the 
    field in each file by which the files are compared. The first field in 
    each line is used by default. There is one line in the output for each 
    pair of lines in file1 and file2 which have identical join fields. Each 
    output line consists of the join field, the remaining fields from file1 
    and then the remaining fields from file2. 

-v file_number 
     Do not display the default output, but display a line for each 
     unpairable line in file file_number. The options -v 1 and -v 2 
     may be specified at the same time. 

-1 field 
     Join on the field'th field of file1. 

-2 field 
     Join on the field'th field of file2. 

join -v 1 <(sort file1.txt) <(sort file2.txt)  # To get the lines in file file1.txt which file file2.txt does not have 
join -v 2 <(sort file1.txt) <(sort file2.txt)  # Vice Versa of above 

Orig無回答/クレジット: - https://stackoverflow.com/a/4544780/5291015

+0

これは素晴らしいツールであり、私の仕事を強化します。 diffを実行した後に余分なコードを書きました。 diffを実行して、diffの結果をファイル1と比較しますが、別のファイルで一致します。 diffの結果をファイル2と比較する別のループを実行しますが、別のファイルで一致します。私がちょうど1行で欲しいものをまったくやります。しかし、私は出力についていくつかのコメントを持っています。まず、いくつかのテストをして、ここに戻ってきたい。 – sara

+0

編集2を見てください – sara

+0

次の手順で新しい投稿を開始する必要があります。ここに返信すると現在の質問の範囲にはなりません。 – Inian

0

コメントでfedorquiが言ったように、diffファイル比較行by。あなたが望むものを達成するために

、あなたが行うことができます:

comm -3 <(sort f1.txt) <(sort f2.txt) > result.txt

(関連部分)マニュアル:ファイルの差分を取得するには

comm - compare two sorted files line by line 

     -1  suppress column 1 (lines unique to FILE1) 

     -2  suppress column 2 (lines unique to FILE2) 

     -3  suppress column 3 (lines that appear in both files) 


EXAMPLES 
    comm -3 file1 file2 
    Print lines in file1 not in file2, and vice versa. 
+0

「-23」とはどういう意味ですか? – sara

+0

私はそれを試して、それは私を与える:通信:ファイル2はソートされた順序ではない、通信:ファイル1はソート順ではありません。 2つのファイルの間に共通線を印刷します。私は違いが共通ではないことを望みます。 – sara

+0

編集された答えをご覧ください。 – rdupz

関連する問題