行がソートされたファイルが2つあります。一方のファイル(B)は、もう一方のファイル(A)のサブセットです。BにないAのすべての行を検索したいと思います。理想的には、これらの行を含むファイル(C)を作成したいと思います。これはUnixで可能ですか?スクリプトを書く代わりに、これを行うための1行のコマンドを探しています。join
およびコマンドをdiff
確認しましたが、これを行うためのコマンドオプションが見つかりませんでした。助けてくれてありがとう。
2544 次
5 に答える
13
これにより、一般的な行が抑制されます。
comm -3 a b
于 2012-05-18T20:05:16.340 に答える
5
これはどう:
grep -v -f B A > C
于 2012-05-18T20:03:50.027 に答える
3
これは diff で行うこともできます。差分(@johloのgrep回答とは異なり)は順序を気にし、ソートされていないファイルで動作します(@ johnshen64のcomm回答とは異なります):
$ cat a
a
b
c
d
e
$ cat b
a
b
f
d
e
$ diff -dbU0 a b
--- a 2012-05-18 16:02:30.603386016 -0400
+++ b 2012-05-18 16:02:45.547817122 -0400
@@ -3 +3 @@
-c
+f
したがって、パイプラインを使用して、省略された行だけを取得できます。順序を考慮してください。
$ diff -dbU0 a b | tail -n +4 | grep ^- | cut -c2-
c
于 2012-05-18T20:09:34.263 に答える
1
このjoin
コマンドは、あなたが求めていることを行います:
join -v 1 fileA fileB > fileC
デモンストレーション:
$ cat fileA
a
c
d
g
h
t
u
v
z
$ cat fileB
a
d
g
t
u
z
$ join -v 1 fileA fileB
c
h
v
これは、質問で述べたように、ソートされたファイルを想定しています。ソートされていないファイルの場合:
join -v 1 <(sort fileA) <(sort fileB)
于 2012-05-18T22:13:30.943 に答える
0
Awk ソリューション
入力ファイル
a
aaa
bbb
ccc
b
ccc
ddd
eel
コード
awk ' NR==FNR { A[$0]=1; next; }
{ if ($0 in A) { A[$0]=0; } }
END { for (k in A) { if (A[k]==1) { print k; } } } ' a b > c
c (出力ファイル)
bbb
aaa
于 2012-05-18T20:21:05.493 に答える