#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» ?