StackOverflow コミュニティで同様のリンクを見つけましたが、私の質問に正確には答えていませんでした。
行数が異なる 2 つのファイルがありますが、両方とも並べ替えられています。元のファイルは数百行の長さですが、トラブルシューティングのために、file1 を 12 行、file2 を 5 行にしました。file2 は file1 のサブセットです。やりたいことは、file1 にはあるが file2 にはないすべての行を出力するコマンドを実行することです。
Unix コマンドを使用しようとしましたがdiff
、comm
どちらも file1 の完全な内容をリストしますが、これは私が望んでいるものではありません。
簡単な例は次のようになります。
File1 File2
A B
B E
C I
E N
G O
I
L
M
N
O
X
ここでは、file2 にあるものはすべて file1 にあることがわかります。何らかの理由で、diff
両方comm
とも file1 の完全な内容を表示しました。これは、行ごとに比較しており、ファイル全体を検索していないためだと思います。
期待どおりの出力が得られる別の Unix コマンドはありますか?
編集: 必要なものを取得するために使用したコマンドは次のとおりです。
a) ファイル1とファイル2の差分
これは基本的に、ファイル1のすべてを<で始まり、コンテンツがファイル1からのものであることを示し、ファイル2のすべてを>で始まり、ファイル1からのものを示す。これは明らかに私が必要としていたものではない。
b) 通信 -23 ファイル1 ファイル2
すると、私が期待していた差分ではなく、ファイル1の内容全体が再び表示されました。また、
c) 通信 -3 ファイル1 ファイル2
comm のヘルプ ページには、ファイル 1 の行は印刷されるがファイル 2 の行は印刷されない、またはその逆と書かれていましたが、私の例では、B は両方のファイルに存在しますが、異なる行に表示されているため、これも私が望んでいた結果を示しませんでした。ただし、出力では、B は一方にはあるがもう一方にはないと認識され、印刷されます。そのため、出力は次のようになります。
A
B
B
C
E
E
etc.
それは私が期待していたものとは違いました。
A
C
G
L
M
X
答え1
それには、ファイルA内のファイルbの内容を逆順にgrepするだけです。
例 :
francois@zaphod:/tmp$
cat > A
az
ae
ar
at
ay
au
francois@zaphod:/tmp$
cat > b
ba
by
ay
at
au
francois@zaphod:/tmp$
grep -v "$(cat /tmp/b)" /tmp/A
az
ae
ar
francois@zaphod:/tmp$
ここでの出力はファイルAの行のみで、ファイルBには存在しません。
答え2
差分出力には、ファイル X がファイル Y になるために何を行う必要があるかが表示されます。
あなたのコメントによれば、次のワンライナーを使うかもしれません:
cat x y | sort -u | cat y - | sort | uniq -u
それは
- 両方のファイルを読む
- 並べ替えて一意の行のみを印刷します(
-u
ソート中) - ファイル(y)を読み取り、パイプ出力と組み合わせる
- リゾート出力
- uniq を使用すると、一度だけ表示される行 (
-u
unique 内) のみが使用されます。
この方法は集合論に基づいています。まず 2 つの集合を加算し、次にそのうちの 1 つを減算します。
答え3
ファイルの 1 つが DOS 形式のテキスト ファイルで、もう 1 つのファイルが Unix 形式のテキスト ファイルである場合、行の文字が同じであっても、各行は他のファイルのすべての行と異なります。これは、1 つのファイルの各行の末尾に追加の復帰文字が存在するためです。この復帰文字は、他のファイルには存在しません。
がUnix テキスト ファイルで が DOS テキスト ファイルのcomm -3 file1 file2
場合、次のような出力が期待されます(これが現在のファイルです)。file1
file2
A
B
B
C
E
E
G
I
I
L
M
N
N
O
O
X
が DOS テキスト ファイルで が Unix テキスト ファイルのcomm -3 file1 file2
場合、次のような出力が期待されます。file1
file2
A
B
B
C
E
E
G
I
I
L
M
N
N
O
O
X
両方のファイルの行末が同じ場合、つまり両方ともDOSテキストファイルまたは両方ともUnixテキストファイルである場合、出力は次のcomm -3 file1 file2
ようになると予想されます。
A
C
G
L
M
X
両方のファイルをUnixテキスト形式に変換するには、次のコマンドを使用します。
dos2unix file1 file2
...dos2unix
ユーティリティがインストールされていることが前提です。