Eu quero soltar a base de registro no registro anterior usando o awk?

1

Arquivo CSV de entrada:

I,TEST1
H,TEST2
H,TEST3
I,TEST4
I,TEST5
H,TEST6
I,TEST7

Arquivo de saída:

I,TEST1
H,TEST2
I,TEST4
I,TEST5
H,TEST6
I,TEST7

Eliminar somente quando houver vários registros H de tipo, siga um registro I do tipo. Deixe o primeiro tipo H e exclua o resto ...

    
por Krrp78 05.03.2018 / 23:35

2 respostas

2

Isso parece ok:

$ cat file1
I,TEST1
H,TEST2
H,TEST3
I,TEST4
I,TEST5
H,TEST6
H,TEST7
H,TEST9
I,TEST10
H,TEST11

$ awk -F"," '/^I/{print;f=1};/^H/ && f==1 && !seen[$1]++{print;seen[$1]=0;f=0}' file1
I,TEST1
H,TEST2
I,TEST4
I,TEST5
H,TEST6
I,TEST10
H,TEST11
    
por 06.03.2018 / 00:13
1
$ awk -F, '($1 == "I" || $1 != p) && p = $1' file.csv
I,TEST1
H,TEST2
I,TEST4
I,TEST5
H,TEST6
I,TEST7
  • Se a primeira coluna de uma linha for I , a variável p (para "anterior") será definida como I e a linha será impressa.
  • Se a primeira coluna não for I , mas não for a mesma que a anterior (ou seja, não é repetida H ), a variável p está definido como H e a linha é impressa.
  • Se a primeira coluna não for I e se também for igual à primeira coluna anterior, a linha será ignorada.

Isso removerá todas as linhas cuja primeira coluna é igual à primeira coluna anterior, exceto as linhas com I como primeira coluna.

Estou usando a atribuição p = $1 como condicional. Se for realizado, e se o valor for diferente de zero (será diferente de zero em todas as instâncias dadas as informações do exemplo na pergunta), então terá o efeito colateral que a linha atual é impressa.

Se a primeira coluna contiver zeros, altere o p = $1 para ((p = $1) || 1) .

    
por 06.03.2018 / 08:03

Tags