Grep sem duplicatas? [fechadas]

1

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?

    
por neverMind9 25.11.2018 / 21:40

6 respostas

2

Que tal

cat * | grep exampletext | sort -u
    
por 26.11.2018 / 00:23
1

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;'
    
por 25.11.2018 / 22:45
1

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
    
por 26.11.2018 / 03:20
1

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 
    
por 25.11.2018 / 22:04
-1

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 : ).

    
por 25.11.2018 / 22:42
-2

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.

  • Quando terminar, leia tempfile.
  • Renomeie para o que quer que seja.

Use with caution in a test directory with test files first

  • Adapte-se às suas necessidades.

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
    
por 25.11.2018 / 21:55