Removendo uma linha específica de um arquivo

7

Em algum lugar no meio do meu arquivo CSV está esta linha:

Products below this line are out of stockNumber, month, year, reference, store

Observação: número, mês, ano, referência e loja são os campos CSV.

Como eu excluo esta linha do arquivo usando um comando de linha de comando?

Observe que o CSV é assim

Number, month, year, reference, store
1,1,2014,13322,main
2,2,2014,13322,main
3,3,2011,1322,main
4,4,2012,3322,main
5,4,2013,122,secondary
Products below this line are out of stockNumber, month, year, reference, store
12,411,2010,122,Albany
25,41,2009,122,Dallas
35,24,2008,122,New
    
por SpaceDog 07.07.2014 / 20:20

7 respostas

17

A maneira mais fácil é usar o comando grep -v :

grep -v "Products below" your_file.csv > new_file.csv

    
por 07.07.2014 / 20:29
10

Com seus dados de entrada, você pode tentar:

$ sed '/^Products/d' file 
Number, month, year, reference, store
1,1,2014,13322,main
2,2,2014,13322,main
3,3,2011,1322,main
4,4,2012,3322,main
5,4,2013,122,secondary
12,411,2010,122,Albany
25,41,2009,122,Dallas
35,24,2008,122,New

Usando sed -i.bak para editar o arquivo no local e criar um arquivo de backup:

sed -i.bak '/^Products/d' file
    
por 07.07.2014 / 20:30
5

Se pudermos supor com segurança que você deseja excluir todas as linhas que começam com Products (incluindo o espaço após a primeira palavra), todas elas funcionarão:

  • awk

    awk '$1!="Products" file > newfile
    
  • perl

    perl -ne 'print unless /^Products/' file > newfile
    

    ou

    perl -ane 'print if $F[0]!="Products"' file > newfile
    

    ou, para editar o arquivo no lugar

    perl -i -ne 'print unless /^Products/; ' file
    perl -i -ane 'print if $F[0]!="Products"' file 
    
  • grep (esta é apenas uma versão mais curta da resposta do svq )

     grep -v ^Products file > newfile
    
  • bash (apenas por diversão)

    while read line; do [[ $line =~ ^Products ]] || echo $line; done <  file > newfile
    
por 07.07.2014 / 20:57
5

no local com ed (no prompt bash )

ed -s file <<<$'/Products below/d\nw'

Ou como don crissti recomenda:

ed -s file <<<$'/Products below/d\nw\nq'
    
por 07.07.2014 / 22:37
3

Você pode usar sed no padrão de pesquisa para excluir cada linha que contém esse padrão

sed -i '/Products below this line are out of stockNumber, month, year, reference, store/d' file
    
por 07.07.2014 / 20:29
3

perl oneliner:

perl -ne 'print unless (m/Products below/') FILE
    
por 07.07.2014 / 20:40
2

Aqui está outro exemplo de uso de sed :

sed '/^Products below this line are out of stockNumber, month, year, reference, store$/d' originalDocument > newDocument
    
por 07.07.2014 / 20:34