awk search help [closed]

0

Preciso de ajuda com um script awk simples para correspondência de letras em linhas.

Por exemplo, Encontrar partidas separadas para KJ em um campo e encontrar correspondências para o KP no próximo?

Name       VT       Kip     Rand
NINA        K        K       kevdhekdmabr2738
NINA        J        P       pdbkemgwjsabeb483
NINA        A        J       meveahsbkdemjep48328
NINA        P        K       ehkmskdldadvsvpm46383
NINA        M        P       zbdamshasjerrj3738   
NINA        J        K       amfjekspdbejd34549
NINA        P        M       pokjdokdam2452355235

Como você pode ver, a coluna Rand tem uma série de letras que correspondem às minhas letras necessárias. Se tiver tentado awk '/nina/ && /K/ && /J/ && /K/ && /P/ {print $0}' sampfile.txt

Existe uma maneira de fazer isso sem se referir a uma coluna / campo específico?

    
por user298390 03.07.2014 / 19:54

2 respostas

1

Não sei o que você tem em relação às colunas nomeadas. Se você quiser especificar o que está neles, precisará chamá-los especificamente.

awk 'NR>1 && $2~/^[KJ]$/ && $3~/^[KP]$/ {print $1}' ...

Corresponde a K-K , K-P , J-K e J-P e imprime a coluna de nome. Ele também irá pular a primeira linha que parece um cabeçalho.

Ele corresponde às seguintes linhas do seu exemplo:

NINA        K        K       kevdhekdmabr2738
NINA        J        P       pdbkemgwjsabeb483
NINA        J        K       amfjekspdbejd34549

Mas, obviamente, só imprime o NINA .

    
por Oli 03.07.2014 / 23:15
1

Pelo que entendi, você deseja exibir as linhas que correspondem a essa condição:

Cada linha contém dois tokens de "K" em qualquer coluna e a seguinte linha contém: Token "J" na mesma coluna do primeiro token "K" e "P" na mesma coluna do segundo "K"

Este programa faz o que você precisa

     BEGIN { nlines = 0; }              
     {   
       lines[nlines] = $0;   
       kfound[nlines] = "";   
       jfound[nlines] = "";   
       pfound[nlines] = "";   
       for (i=1;i<=NF;i++) {
          if ($(i) == "K") kfound[nlines] = kfound[nlines] " " i;
          if ($(i) == "J") jfound[nlines] = i;
          if ($(i) == "P") pfound[nlines] = i;   
       }   
       nlines++; 
     } 
     END {   
        for(i=0;i<nlines;i++) {
           ntok = split(kfound[i],tok," ");
           if (ntok < 2) continue;
           if (tok[1] == jfound[i+1] && tok[2] == pfound[i+1]) {
              print lines[i];
              print lines[i+1];
           }   
        } 
     }

Salve no arquivo test.awk e tente:

awk -f test.awk fileWithInputLine.txt
    
por Lety 04.07.2014 / 00:02