найдите пересечение 4 файлов

#macos #ubuntu #terminal #string-search

#macos #ubuntu #терминал #строка-поиск

Вопрос:

Как вы находите пересечение 4 файлов?

Я использовал grep -Fx -f 1.txt 2.txt 3.txt 4.txt , но, похоже, это работает только для 2 файлов. Аналогично comm -12 1.txt 2.txt не может быть расширен до 4 файлов и требует сортировки данных. Мои данные не отсортированы, на самом деле, этого не должно быть. Я на Mac.

Ввод:

 1.txt
.css
.haha
.hehe
2.txt
.ajkad
.shdja
.hehe

3.txt
.css1
.aaaaa
.hehe

4.txt
.qwqw
.kkkmsm
.hehe
  

Вывод: .hehe

Сначала я использовал grep для 1 и 2, хранящихся в 12.txt , чем на 3 и 4, хранящихся в 34.txt затем снова использовал grep на 12.txt и 34.txt . Но должен быть лучший способ сделать это.

Комментарии:

1. Что вы подразумеваете под пересечением в данном случае? Можете ли вы предоставить краткий пример ввода и желаемый результат?

2. вот и все…

Ответ №1:

Вы можете объединить greps в цепочку:

 grep -f 1.txt 2.txt 
| grep -f- 3.txt 
| grep -f- 4.txt
  

-f- Означает, что используются входные данные, поступающие из канала, а не реальный файл.

Комментарии:

1. @sanjihan: А как насчет grep -f <(grep -f <(grep -f 1.txt 2.txt) 3.txt) 4.txt ?

2. Это правильно, я неверно истолковал свои данные. Спасибо!

Ответ №2:

Вы можете найти пересечение между двумя:

 $ grep -Fx -f f1.txt f2.txt
.hehe
  

Затем используйте это в качестве входных данных с двумя другими:

 $ grep -f <(grep -Fx -f f1.txt f2.txt) f3.txt f4.txt
f3.txt:.hehe
f4.txt:.hehe
  

Или, если вам нужно всего одно слово:

 $ grep -f <( grep -f <(grep -Fx -f f1.txt f2.txt) f3.txt) f4.txt
.hehe