Que tal
cat * | grep exampletext | sort -u
Eu tenho várias revisões de um arquivo de texto em arquivos separados na mesma pasta.
Como posso grep
todos os arquivos nessa pasta sem listar nenhuma duplicata de linhas com texto idêntico?
Eu uso:
grep -h test files* | puniq
puniq
é: perl -ne '$seen{$_}++ or print;'
É semelhante a sort -u
, mas não classifica a entrada e fornece saída durante a execução.
Se você quiser o nome do arquivo e evitar linhas duplicadas em cada arquivo:
parallel --tag --lb 'grep string {} | puniq' ::: files*
Se você quiser o nome do arquivo e não quiser linhas duplicadas de nenhum dos arquivos (os nomes dos arquivos não devem conter TAB (\ t)):
parallel --tag --lb grep string {} ::: files* |
perl -ne '/^[^\t]+(.*)/ and $seen{$1}++ or print;'
Talvez algo como isto possa estar próximo do que você imagina (funciona com o gnu awk):
cat file1
1
2
3
22
cat file11
1
2
3
8
9
cat file111
1
2
3
5
6
awk '{seen[$0]++;fname[$0]=FILENAME};END{for (k in seen) {if (seen[k]==1) print fname[k],":",k}}' file1*
file111 : 5
file111 : 6
file11 : 8
file11 : 9
file1 : 22
Canalize o resultado para classificar para filtrar duplicatas.
grep -re pattern files and dirs ... | sort -ut: -k2
As opções -t:
e -k2
de classificação farão com que ele ignore o nome do arquivo ao fazer a classificação e a mesclagem.
Ou, se você não quiser os nomes dos arquivos, simplesmente:
grep -hre pattern files and dirs ... | sort -u
Se o que você precisa é descobrir quais arquivos correspondem a algum texto, use:
$ grep -rl 'text to find' ./dir
Se você precisar apenas da primeira correspondência de cada arquivo:
$ for file in ./*; do sed -n '/text to match/{p,q}' "$file"; done
que não imprimirá o nome dos arquivos correspondentes, mas será rápido.
Ou:
$ find ../* -type f -exec sh -c '
a=$(sed -n "/echo/{p;q}" "$1");
[ "$a" ] && printf "%s\n" "$1 : $a"
' findsh {} \;
Se você precisar do nome do arquivo também (separado por :
).
Eu usaria algo como:
#!/bin/bash
echo "What is the files base name? e.g. testfile"
read filename
for i in *$filename*; do
cat $i >> tempfile
cat tempfile | sort -u -o tempfile
done
ou
cat *filename* | sort -u
The placement of the *'s is based on how you name your itterations.
Use with caution in a test directory with test files first
Meu script se transforma:
testfile1 testfile2 testfile3
This is line 1 This is line 5 This is line 5
This is line 2 This is line 6 This is line 2
This is line 3 This is line 7 This is line 7
This is line 4 This is line 8 This is line 3
Em:
This is line 1
This is line 2
This is line 3
This is line 4
This is line 5
This is line 6
This is line 7
This is line 8