2012-05-18 19 views
5

Sıralı satırlarla iki dosyam var. Bir dosya (B) diğer dosyanın (A) bir alt kümesidir. B'deki tüm satırları bulmak istemiyorum. İdeal olarak, bu satırları içeren bir dosya (C) oluşturmak istiyorum. Unix'te bu mümkün mü? Bir komut dosyası yazmak yerine bunu yapmak için tek satırlı bir komut arıyorum. join ve diff komutlarına baktım, ancak bunu yapmak için bir komut seçeneği bulamadım. Yardım için teşekkürler. Bu konudaKüme satırından iki dosyanın Kümesi - Kümesi nasıl bulunur?

cevap

12

Bu bastırır ortak hatları:

comm -3 a b 
+1

Ve durumunda Hiç iki dosyada ortak satırlar bulmak istiyorum, üçüncü dosyası oluşturmak için – voithos

+0

ab'' iletişimi -12 kullanabilirsiniz -3 ab> c' – 0x4a6f4672

5

Nasıl:

grep -v -f B A > C 
3

Siz de fark ile yapabilirsiniz. sipariş umurunda (@ johlo en grep cevap aksine) Diff, (@ johnshen64 en comm cevap aksine) olmayan sıralı dosyalar üzerinde çalışır:

$ 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 

Yani sadece ihmal hatlar-düşünen sipariş almak için bir boru hattı kullanabilirsiniz:

$ diff -dbU0 a b | tail -n +4 | grep ^- | cut -c2- 
c 
0

Awk Çözüm

Girdi dosyaları

bir

aaa 
bbb 
ccc 

b

ccc 
ddd 
eel 

Kod

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 (çıktı dosyası)

bbb 
aaa 
+0

OP özellikle komut dosyası olmayan bir çözüm istedi. Verilen komut dosyasını komut satırına koydunuz, ama ... – derobert

1

Bu join komut ne istediğini yapacak:

join -v 1 fileA fileB > fileC 

Gösteri: Eğer sorunuzu belirtildiği gibi

$ 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 

Bu sıralı dosyaları varsayar. sıralanmamış dosyaları için: bir ders `comm kullanmak c

join -v 1 <(sort fileA) <(sort fileB)