Preciso de dados de um arquivo csv que não esteja presente no segundo arquivo csv

3

Por exemplo: Eu tenho um arquivo CSV (primeiro arquivo) com os dados abaixo (verticalmente):

1
2
3
4
5
6

Segundo CSV com dados abaixo (verticalmente):

5
6
7
8

Eu quero o meu arquivo resultante (a ação precisa ser executada usando shell script do Unix) para mostrar apenas valores (verticalmente) no primeiro arquivo, mas não no segundo arquivo:

1
2
3
4
    
por user3116123 28.01.2014 / 15:21

3 respostas

4

Supondo que os arquivos estejam em ordem de classificação, você pode usar o comando comm para comparar os dois arquivos e mostrar os resultados que estão em file1 , mas não em file2 .

$ comm -23 file1 file2
1
2
3
4

A opção -23 informa comm para omitir as linhas que estão apenas no arquivo2 ( -2 ) e as linhas que estão em ambos ( -3 ).

    
por 28.01.2014 / 15:41
2

Use o seguinte comando:

diff file1 file2 | grep '<' | cut -c3-

O diff leva a diferença dos arquivos file1 e file2, então nós grep '<' da saída do primeiro comando para obter as linhas que pertencem apenas ao primeiro arquivo. A saída é então alimentada para cut -c3- para truncar os dois primeiros caracteres para que '<' e '' são eliminados.

    
por 28.01.2014 / 15:29
1

Transmita um arquivo como padrão para grep :

grep -vwFf 2.csv 1.csv 
1
2
3
4

De man grep :

   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)
   -w, --word-regexp
          Select  only  those  lines  containing  matches  that form whole
          words.  The test is that the matching substring must  either  be
          at  the  beginning  of  the  line,  or  preceded  by  a non-word
          constituent character.  Similarly, it must be either at the  end
          of  the  line  or  followed by a non-word constituent character.
          Word-constituent  characters  are  letters,  digits,   and   the
          underscore.
   -F, --fixed-strings
          Interpret PATTERN as a  list  of  fixed  strings,  separated  by
          newlines,  any  of  which is to be matched.  (-F is specified by
          POSIX.)
   -v, --invert-match
          Invert the sense of matching, to select non-matching lines.  (-v
          is specified by POSIX.)
    
por 28.01.2014 / 17:51

Tags