対称次官?

対称次官?

a文字列リストと改行文字、文字列リストと改行文字を含むファイルを生成するコマンドがありますb.txta出力と内容の対称的な違いを計算するコマンドが必要ですb.txt。理想的には、このコマンドはa非常に遅くなる可能性があるため、パイプラインで実行する必要があります。

ベン図が好きな場合(Wikipedia):

対称差分演算

例にもっと興味がある人のために:

a出力

apple
car

b.txt

banana
car
dog

その場合、結果は次のようになります。

apple
banana
dog

答え1

あなたはそれを使用することができますプロセスの交換コマンドの出力をファイルとして処理します。

comm -3 <(a | sort) <(sort b.txt)

答え2

commファイルを個別に並べ替え、それを使用して共通の行を見つけると、並べ替えソリューションが少し速くなる可能性があります。

sort a.txt -o a.txt
sort b.txt -o b.txt
comm -3 a.txt b.txt | sed 's/^\t//'

あるいは、データファイルの1つが大きすぎない場合は、それらをすべて連想配列として読み取ってから、他のファイルを1行ずつ比較することもできます。たとえば、awkを使用すると、次のようになります。

awk '
ARGIND==1 { item[$0] = 1; next }
ARGIND==2 { if(!item[$0])print; else item[$0] = 2 }
END   { for(i in item)if(item[i]==1)print i }
' a.txt b.txt

ARGINDファイルパラメータは上記で計算されます。最初の行はファイルの1行を配列に保存しますitem。次の行は、ファイル2の現在の行がこの配列にあることを確認します。それ以外の場合は印刷されます。それ以外の場合は、そのエントリが両方のファイルに表示されることがわかります。最後に、両方のファイルに表示されない項目を印刷します。

ファイルの1つが他のファイルよりもはるかに小さい場合は、アイテムの配列が小さくなるように最初にargsにファイルを配置することをお勧めします。

if [ $(wc -l <a.txt) -lt $(wc -l <b.txt) ]
then args="a.txt b.txt"
else args="b.txt a.txt"
fi
awk '
ARGIND==1 { item[$0] = 1; next }
ARGIND==2 { if(!item[$0])print; else item[$0] = 2 }
END   { for(i in item)if(item[i]==1)print i }
' $args

答え3

違いを確認するための素晴らしいツールですdiff。出力形式を正しく指定するには、重要なオプションを少し試してください。

diff --unchanged-group-format= --new-group-format="%>" a b.txt

パイプファイルでない場合は、a以下を使用する必要があります-

echo 'apple
car' | diff --unchanged-group-format= --new-group-format='%>' - b.txt

出力:

apple
banana
dog

または、ファイルに行が表示されるコンテキストに興味がない場合:

echo 'apple
car' | sort | diff --unchanged-group-format= --new-group-format='%>' - <(sort b.txt)

関連情報