Grep-файл с шаблоном и количеством совпадений отдельных шаблонов в файле без изменения порядка

#grep

#grep

Вопрос:

мне нужно получить общее количество совпадений из input.txt в цифрах, используя слова в pattern.txt , он также должен совпадать между тегами.

это код, который я использую, и он работает, но вывод должен быть таким же, как сортировка из input.txt а также удалить шаблон из конечного вывода

 grep -of pattern.txt input.txt | sort | uniq -c | awk '{print $2,$1}' > output.txt
  

pattern.txt:

 sistersdrama.com
sisterssatellite.com
orientalsisters.com
  

input.txt:

 <Model Make="www.sistersdrama.com" Displacement="1.6" HP="116" Year="2003"/>
<Model Make="sistersdrama.com="3.5" HP="298" Year="2003"/>
<Model Make="sistersdrama.com" Displacement="3.0" HP="200" Year="2011"/>
<Model Make="sistersdrama.com" Displacement="2.0" HP="257" Year="2002"/>
<Model Make="www.sisterssatellite.com" Displacement="2.5" HP="278" 
Year="2002"/>
<Model Make="www.sisterssatellite.com" Displacement="3.0" HP="224" 
Year="2009"/>
<Model Make="sisterssatellite.com" Displacement="1.8" HP="172" 
Year="2007"/>
<Model Make="sisterssatellite.com" Displacement="2.8" HP="186" 
Year="2001"/>
<Model Make="orientalsisters.com" Displacement="2.8" HP="179" 
Year="2006"/>
<Model Make="orientalsisters.com" Displacement="2.8" HP="207" 
Year="2013"/>
<Model Make="orientalsisters.com" Displacement="2.8" HP="246" 
Year="2008"/>
<Model Make="orientalsisters.com" Displacement="2.8" HP="244" 
Year="1999"/>
<Model Name="orientalsisters.com" Displacement="2.8" HP="244" 
Year="1999"/>
  

с помощью используемого кода я получаю output.txt:

 orientalsisters.com 4
sistersdrama.com 3
sisterssatellite.com 2
  

ожидаемые результаты в том же порядке, что и pattern.txt , только цифры и вычесть 2:

 1
0
2
  

Ответ №1:

удалить sort и изменить awk с '{print $2,$1}' на '{print $1}'

 grep -of pattern.txt input.txt | uniq -c | awk '{print $1}'
  

и если вы хотите вычесть 2 из каждого результата, это будет

 grep -of pattern.txt input.txt | uniq -c | awk '{print $1-2}'
  

Редактировать

Вы несколько раз меняли свой вопрос, и каждый раз был кардинально другой запрос. Вы должны оставить старую версию своего вопроса как есть, потому что эти радикальные изменения также делают ответы неправильными и неактуальными. Если вы хотите что-то другое, просто создайте новое сообщение и спросите там.

Если у вас есть несколько файлов с шаблоном имен, введите *.txt (например input_1.txt input_2.txt ввод (что угодно).txt) это должно сработать:

 cat pattern.txt |sed s/\./\\\\./g|xargs -I {} grep -o "$(echo "Make="{}"|Make Model="{}"")" input*.txt | sed -r -e 's/.*="(.*)"/ 1 /g' > temp_agg.txt amp;amp; cat pattern.txt|sed s/\./\\\\./g | xargs -I {} grep -o {} temp_agg.txt | uniq -c | awk '{print $1-2}'
  

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

1. похоже, это работает, но есть ли способ добавить исключения? поскольку в input.txt некоторые строки являются www.sistersdrama.com и затем они также будут добавлены в качестве выходных данных, я обновил вопрос

2. попробуйте grep -oxf pattern.txt input.txt | uniq -c | awk '{print $1-2}'

3. Спасибо! я обновил вопрос, поскольку у меня есть несколько документов, и мне нужно сопоставлять строки между тегами, и есть ли какой-либо способ ускорить процесс?

4. на самом деле это сработало идеально для половины моих файлов! и это было также быстрее! есть ли способ также включить другое регулярное выражение в скрипт, чтобы оно соответствовало тому, что находится в шаблоне, из другого тега: Смещение =»orientalsisters.com » этот тег не всегда находится в том же положении, что и в input.txt пример

5. итак, вы хотите отфильтровать строки, содержащие атрибут Displacement=»test» ?