2015-03-30 6 views
4

Я все еще новичок в bash, и я нашел похожие вопросы для себя, но я все еще не могу решить свою проблему. У меня есть два файла с двумя столбцами, разделенные пробелом.найти несоответствующие строки из двух файлов bash

файл 1:

1 AGCATTTTTCAAACGAAAGATTTACTACCGATGTGT 
2 TGCTCACCAACAAAAACAGGCGTCTCAGCAGCAGCA 
3 GATCGAACCGGCTGCCTACTGCGTGTAAAGCCGCCC 
4 CCGACACAGAGAACATTAGAATACTCAGAGCCATNN 
5 TAAGCCTGAGCCTAAACCTAAGCCTAAACATAAGAA 
6 AGCAGAGAAGAGATGAGTTGTCGAGTGAGGCGTAAG 
7 AACGTTGAAAAATTATCCCGTCAACAGTCTCCAGAA 
8 GCCAGAGAGTAAAATATTGGGTGAAGCCAGAGAGTA 
9 TGCTCACCAACAAAAACAGGCGTCTCAGCAGCAGCA 

файл 2:

1 AGCATTTTTCAAACGAAAGATTTACTACCGATGTGT 
2 TGCTCACCAACAAAAACAGGCGTCTCAGCAGCAGCA 
3 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
4 CCGACACAGAGAACATTAGAATACTCAGAGCCATNN 
5 TAAGCCTGAGCCTAAACCTAAGCCTAAACATAAGAA 
6 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
7 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
8 GCCAGAGAGTAAAATATTGGGTGAAGCCAGAGAGTA 
9 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 

Я хотел бы сравнить только второй столбцы каждого файла, строка за строкой, а выход третьего файла с только несогласованные линии.

выход:

3 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
6 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
7 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
9 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 

ответ

5

Вы можете использовать awk:

awk 'NR==FNR{a[$2];next} !($2 in a)' file1 file2 
3 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
6 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
7 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
9 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 

Объяснение:

NR == FNR {     # While processing the first file 
    a[$2]      # just push the second field in an array 
    next      # move to next record of first file 
} 
!($2 in a)     # print lines from file2 if array a doesn't that line 
1

Вы можете использовать diff для этого. diff распечатает различия в двух файлах.

/test>diff file1 file2 
3c3 
< 3 GATCGAACCGGCTGCCTACTGCGTGTAAAGCCGCCC 
--- 
> 3 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
6,7c6,7 
< 6 AGCAGAGAAGAGATGAGTTGTCGAGTGAGGCGTAAG 
< 7 AACGTTGAAAAATTATCCCGTCAACAGTCTCCAGAA 
--- 
> 6 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
> 7 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
9c9 
< 9 TGCTCACCAACAAAAACAGGCGTCTCAGCAGCAGCA 
--- 
> 9 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 

для всего оглавлению отличий от второго файла:

/test>diff file1 file2 | grep ">" 
> 3 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
> 6 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
> 7 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
> 9 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
+0

Если файлы большие это лучше, может быть, с '--suppress-общий -lines' – Kuzeko

3
grep -vf file1 file2 

Выход:

 
3 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
6 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
7 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
9 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
+0

Действительно хороший трюк! – higuaro

+0

Я думаю, что OP хочет сравнить только 2 поля из обоих файлов, но в этом случае это может работать с предоставленными данными, – anubhava

+0

Да. Это работает, потому что каждая строка уникальна, и оба файла сортируются одинаково. – Cyrus

Смежные вопросы