2013-06-10 2 views
1

У меня есть два файла, как:Найти сходство между двумя файлами

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

и файл с двумя колонками

1 0.11 
2 0.12748 
5 0.45 
12 0.48 
7 0.48 
8 0.7 
13 0.78 
14 0.88 

Я хотел бы найти thesimilarities между двумя файлами. Если в обоих файлах число в файле 1 apper также находится в первом столбце файла 2, это означает, что оно должно появиться в выходном файле. Выходной сигнал должен быть:

1 0.11 
2 0.12748 
5 0.45 
7 0.48 
8 0.7 

Я пробовал использовать различные комбинации grep, но он не работает.

ответ

4

С AWK:

awk 'NR==FNR{a[$1]++;next}$1 in a' test.1 test.2 

Примечание в массиве строки появляются в первом файле, а затем распечатать строки в секунду, что было в первом. Строки появятся на выходе в порядке их появления во втором файле.

Или присоединиться:

join <(sort test.1) <(sort test.2) 

файлы должны быть отсортированы. Строки появятся в словаре.

+0

+1 @ Кевин. один вопрос, однако, я видел некоторые, использующие 'a [$ 1] ++' и некоторые просто 'a [$ 1]'. Есть ли преимущество использования одного над другим? –

+2

Разница в том, что 'a [$ 1]' создает пустую запись, поэтому более поздние операторы '$ 1 в'' будут проверять true, но' a [$ 1] 'будет проверять false; 'a [$ 1] ++' приведет к тому, что оба 'a [$ 1]' и '$ 1 в'' будут проверять true. Поэтому при использовании '$ 1 в a' нет никакой практической разницы, но' a [$ 1] 'будет отличаться. – Kevin

+0

Спасибо, Кевин. Теперь ясно! :) –

5

Вы можете использовать grep -f patt_file file, чтобы получить шаблоны из файла. То есть, поиск в file узоров включен в patt_file.

Смотрите вывод с данного входа:

$ grep -w -f file1 file2 
1 0.11 
2 0.12748 
5 0.45 
7 0.48 
8 0.7 

От man grep:

-f ФАЙЛ, --file = ФАЙЛ

Получить образцы из ФАЙЛА, по одному в линия. Если эта опция используется несколько раз или объединена с параметром -e (--regexp), выполните поиск всех заданных шаблонов. Пустой файл содержит нулевые шаблоны и, следовательно, ничего не соответствует.

+0

Есть ли разница между вашим ответом и 'grep -w -F -f'? Я всегда использую второй, поскольку он, кажется, быстрее. – PoGibas

+0

Честно говоря, я не совсем знаком с '-F', поэтому я не знаю :) – fedorqui

+0

Не уверен, что« число в файле 1 apper также в первом столбце файла 2 »полностью выполнено. Это приведет к вытягиванию линий, где второй столбец имеет значение «1,2,3..4 и т. Д.». Не уверен, что OP имеет такие данные, поэтому, если он считает, что это хорошо, мой +1 все еще стоит. –

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