a
文字列リストと改行文字、文字列リストと改行文字を含むファイルを生成するコマンドがありますb.txt
。a
出力と内容の対称的な違いを計算するコマンドが必要です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)