Tente isso:
fgrep -of file1.txt file2.txt | sort | uniq -c
Tenha em atenção que isto apenas encontrará as frases exatas. Se o espaçamento for diferente, ele não os encontrará.
Eu tenho file1.txt
com valores de string como
New Drug Application
Drug Product
Dosing instructions
Preciso contar com que frequência essas sequências ocorrem em file2.txt
com dados como
Regulatory New Drug Application for Drug Product after testing of Dosing instructions for all new studies.
Os comandos que usei são
foreach string ( 'cat terms.txt' )
foreach? echo $string >>out.txt
foreach? grep $string data.txt | wc >>out.txt
end
O out.txt
não retornará a string completa com espaços. Em vez disso, ele retorna dados como:
The -1
New -2
Application -1
etc.
Eu tentei adicionar orçamentos e barras nos termos dos meus arquivos de dados, egrep
, fgrep
- sem sucesso. Como obtenho os dados desejados desses dois arquivos?
Tente isso:
fgrep -of file1.txt file2.txt | sort | uniq -c
Tenha em atenção que isto apenas encontrará as frases exatas. Se o espaçamento for diferente, ele não os encontrará.
Provavelmente você poderia usar o IFS (Internal Field Separator), e atribuir o $ '\ n' a ele, significando que apenas newlines são o separador válido. Além disso, para detectar várias ocorrências da mesma chave no conteúdo, poderíamos usar a opção grep -o. Exemplo de script bash poderia ser como o seguinte:
IFS=$'\n'
for string in 'cat key.txt'
do
$string >> out.txt
grep -o $string content.txt | wc -l >> out.txt
done
Você precisa percorrer toda a linha. Isso pode ser feito da seguinte forma -
x=1
len=$(wc -l file1.txt | awk '{print $1}')
while [ $x -le $len ]
do
#pat=$(head -$x file1.txt | tail -1) << slow hence changed
pat=$(sed "${x}q;d" $1)
#cnt=$(grep -c "$pat" file2.txt) < Edited to count all matches
cnt=$(grep -o "$pat" file2.txt| wc -l | awk '{print $1}')
echo "$pat $cnt"
x=$(expr $x + 1)
done
EDITADO: para acelerar e contar múltiplas ocorrências na mesma linha
Tags search shell-script string