Preencha linhas vazias em colunas específicas com valores

3

Eu tenho dados do seguinte formato:

2342 1
6473 2
7463 2
3647
2734 1
9343

As linhas que não têm um valor na segunda coluna estão vazias nesse ponto (ou seja, não há espaço, guia etc.). Eu estou procurando um comando simples que coloca um '-9' nos lugares abertos da coluna 2.

(Basicamente, um comando awk que verifica se a linha é diferente de zero na coluna 2 e, em seguida, adiciona '-9' se for esse o caso, eu diria ..)

Exemplo estendido (dados com mais colunas, algumas das quais contendo erros). Eu só quero adicionar '-9' à última coluna (ou seja, as outras colunas podem ter erros).

2342 0 12 1
6473   13 2
7463 0 14 2
3647 0  
2734 0    1
9343 0 16 
    
por mats 13.08.2015 / 13:50

4 respostas

4

Se seus dados forem expressos em colunas de largura fixa, você poderá fazer:

Para o primeiro caso:

sed 's/^.\{4\}$/& -9/'

(adicione " -9" a linhas de 4 caracteres).

Para o segundo caso:

sed -e '/.\{11\}/b' -e 's/$/          /;s/\(.\{10\}\).*/-9/'

(adicione até 10 espaços e -9 para linhas com menos de 11 caracteres).

Geralmente, para analisar linhas com campos de largura fixa, consulte a variável especial FIELDWIDTHS do GNU awk .

    
por 13.08.2015 / 14:37
1

Com o GNU sed

sed ':;s/^.\{0,9\}$/& /;t;s/^.\{10\}$/&-9/' file

Adiciona um espaço, desde que o número de caracteres esteja abaixo de dez usando o teste t .
Em seguida, substitui as linhas por dez caracteres e -9.

    
por 13.08.2015 / 15:18
0

Você pode tentar com este awk com seu primeiro exemplo:

awk 'NF == 1 { $2 = -9; } 1' file

Como mencionado em outras postagens com gawk , você pode usar FIELDWIDTHS para tentar isso com o segundo:

gawk 'BEGIN { FIELDWIDTHS = "4 1 1 1 2 1 1"} { for (i = 1; i <= NF; i++) { if ($i == "") { if (i == 7) $i = "-9"; else $i = " "; } } printf("%s %s %s %s\n", $1, $3, $5, $7); }' file
    
por 13.08.2015 / 13:57
0

Você pode usar isto:

perl -ane 'if(!$F[1]){print $F[0]," -9\n"}else{print $_;}'

Este comando lê sua linha de entrada e imprime um "-9" na segunda coluna, se estiver vazia.

echo "2342 1
6473 2
7463 2
3647
2734 1
9343" | perl -ane 'if(!$F[1]){print $F[0]," -9\n"}else{print $_;}'

2342 1
6473 2
7463 2
3647 -9
2734 1
9343 -9
    
por 13.08.2015 / 16:12