Imprime a primeira e última correspondência de um campo com awk

1

Eu tenho um separador delimitado por file :

qrs     John    tuv
abcd    Sam     efgh
ijk     Sam     lmnp
abcd    Sam     efgh
ijk     Sam     lmnp
qrs     John    tuv

Estou tentando imprimir a linha na qual o segundo campo não corresponde ao valor da linha anterior no segundo campo e imprimir a linha na qual o segundo campo não corresponde à próxima linha.

Eu tenho jogado com variações do seguinte, mas nada está funcionando como eu esperava:

awk -F"\t" '{
    name=$3;
    line=$0;
    getline;
    newname=$3;
    newline=$0;
    getline;
    nextname=$3;
    nextline=$0; 
    if (newname != name || name != nextname)print line"\n"nextline }' input.txt
    
por rcjohnson 08.09.2015 / 17:42

2 respostas

2

De você comentário , presumo que seja um arquivo de log com datas de login e logout, por exemplo:

date1   John    logout
date2   Sam     login
date3   Sam     work1
date4   Sam     work2
date5   Sam     logout
date6   John    login

Use awk :

awk 'NR!=1&&$2!=f{print p"\n"$0} {f=$2; p=$0}' file

Onde:

  • NR!=1 é verdadeiro quando awk processa todas as linhas, mas a primeira ( NR contém o número da linha no arquivo atual)
  • $2!=f compara o segundo campo $2 com o valor da variável f ( f será definido posteriormente)
    • Se ambas as configurações se aplicarem, awk imprime o valor de p (a linha anterior também será definida posteriormente), uma nova linha de linha \n e a linha atual $0 .
  • O que acontece agora é processado em cada linha: A variável f está definida para o segundo campo $2 e a variável p para a linha atual $0 . Ambos serão usados na próxima iteração (quando a próxima linha for processada).

Isso agora imprime a primeira e a última ocorrência do segundo campo, de modo que as datas e nomes de logout e login. A saída seria então:

date1   John    logout
date2   Sam     login
date5   Sam     logout
date6   John    login
    
por 08.09.2015 / 19:03
1

Ao especificar uma variável com valor de $2 , tente abaixo o comando:

awk -F"\t" 'NR != 1 { if ( x != $2 ) print $0; } { x = $2 }' file
    
por 08.09.2015 / 17:49