Substitua certas cadeias com valor da linha anterior

2

Eu tenho o seguinte texto:

Source IP,URL
1.1.1.1,example1.com
Blank,example2.com
2.2.2.2,example3.com
Blank,example4.com
Blank,example5.com
Blank,example6.com
Blank,example7.com
7.7.7.7,example8.com
Blank,example9.com
Blank,example10.com

Como posso substituir "Blank" pelo valor não-branco acima e obter a seguinte saída?

Source IP,URL
1.1.1.1,example1.com
1.1.1.1,example2.com
2.2.2.2,example3.com
2.2.2.2,example4.com
2.2.2.2,example5.com
2.2.2.2,example6.com
2.2.2.2,example7.com
7.7.7.7,example8.com
7.7.7.7,example9.com
7.7.7.7,example10.com
    
por Kolico300 16.05.2013 / 03:45

3 respostas

1

Aqui está uma solução Perl:

perl -pe ' $prev=$1 if /^([\d\.]+)/; s/Blank/$prev/' file.txt

Explicação:

  • O -p flag do Perl significa "Percorra o arquivo de entrada linha a linha e imprima cada linha", -e significa "executar o script fornecido na linha de comando".

  • $prev=$1 if /^([\d\.]+)/; : Se a linha começar com ( ^ ) uma cadeia de números ( \d ) e pontos \. , salve essa cadeia (o IP) como $prev . Assim, quando o script ler o arquivo, $prev conterá o último IP encontrado.

  • s/Blank/$prev/ : substitua a string Blank pelo valor de $prev .

por 16.05.2013 / 12:23
0
awk -F, '{if ($1 == "Blank") ip=repltext; else {ip=$1; repltext=$1;};
  print ip "," $2}' inputfile

assumindo que "IP de origem, URL" não faz parte da entrada. Se é mudar para

awk -F, 'NR == 1 {next;}; {if ($1 == "Blank") ...

Assumindo também que a primeira linha de dados não contém "Em branco", mas sempre um endereço IP.

    
por 16.05.2013 / 03:58
0

Aqui está uma solução idiomática para o awk:

<infile awk '$1 == "Blank" { $1 = p } { p = $1 } 1' FS=, OFS=,

Saída:

Source IP,URL
1.1.1.1,example1.com
1.1.1.1,example2.com
2.2.2.2,example3.com
2.2.2.2,example4.com
2.2.2.2,example5.com
2.2.2.2,example6.com
2.2.2.2,example7.com
7.7.7.7,example8.com
7.7.7.7,example9.com
7.7.7.7,example10.com
    
por 16.05.2013 / 14:08