como deletar um cabeçalho sem deletar outras linhas no linux?

2

Eu tenho um arquivo de dados enorme como:

calls...
12311 34213 13344 12345 34532
23345 24445 22445 12344 12333
34456 22211 12334 12234 23344
23345 24445 22445 12344 12333

que eu quero excluir a primeira linha (que é escrita chama ... lá).

Eu usei este comando:

sed '1d' input.txt > output.txt

que exclui "chamadas ...". Mas o problema é que algumas outras linhas são excluídas também. Algum corpo tem alguma outra sugestão que me ajude a apagar chamadas ... sem apagar as outras linhas dentro? meus dados reais tem 117.000 linhas e 10.000 colunas quando eu uso este comando, em seguida, o número de linhas recebe 68.645, enquanto ele deve obter 116.999. Quando eu tento sed em pequenos dados como o exemplo que mostrei aqui, o número de linhas não muda, enquanto nos meus dados reais isso acontece. Estou realmente confuso por quê?

    
por zara 28.09.2015 / 07:18

4 respostas

2

Você pode usar tail

tail -n +2 input.txt > output.txt

imprimirá as linhas do arquivo a partir do segundo (observe o sinal +)

    
por 28.09.2015 / 07:24
1

Você também pode usar o comando awk :

Exemplo 1:

awk '{gsub("^calls\.+", "");print}' input.txt > output.txt

Eliminará linhas de input.txt e colocará em output.txt .

Exemplo 2:

awk '!/^calls\.+/{print}' input.txt > output.txt

Isso imprimirá todas as linhas, exceto o padrão fornecido no comando awk .

    
por 28.09.2015 / 09:04
0

Usar endereçamento de padrão

Com o GNU sed, você pode usar endereços padrão para limitar seus comandos. Por exemplo:

sed -r '/^calls\.{3}$/d' input.txt

excluirá apenas as linhas que começam com um padrão correspondente.

    
por 28.09.2015 / 07:30
0

Eu não fiz muita edição de arquivos tão grandes, mas dado que o sed é planejado como um editor STREAM, pode ser inadequado para o propósito, como se eu entendi corretamente que todo o conteúdo do arquivo terá para ser canalizado através de sed desnecessariamente. Supondo que seja apenas o arquivo com o qual você está lidando e que você não está tentando incorporar esse comportamento em um script complicado, eu simplesmente copio o arquivo de entrada para a saída e uso o vi para remover a primeira linha. O vi funciona melhor do que a maioria dos editores (por exemplo, gedit) em arquivos enormes e isso parece ser um caso em que o vi seria a melhor escolha. (E sim, eu sou um grande fã do vi em primeiro lugar;)

cp input.txt output.txt
vi output.txt
# Within vi, type:
ggddZZ
# gg goes to the first line (if you're not there already); dd deletes
# the line you're on; ZZ saves the file and exits.
# Voila, you're done!
    
por 28.09.2015 / 09:44

Tags