awk search help [closed]

Мне нужна помощь с простым скриптом awk для сопоставления букв в строках.

Например, поиск отдельных совпадений для KJ в одном поле и поиск совпадений для KP в следующем?

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

Как вы можете видеть, все столбцы Rand содержат ряд букв, соответствующих моим нужным буквам. {{1 }} Если пробовали awk '/ nina / && / K / && / J / && / K / && / P / {print $ 0}' sampfile.txt

Есть ли способ сделать это, не обращаясь к конкретный столбец / поле?

0
задан 3 July 2014 в 21:54

2 ответа

Я не знаю то, что Вы имеете против именованных столбцов. Если Вы хотите определить то, что находится в них, необходимо вызвать их конкретно.

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

, Который будет соответствовать K-K, K-P, J-K и J-P и печатать столбец имени. Это также пропустит первую строку, которая похожа на заголовок.

Это соответствует следующим строкам от Вашего примера:

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

, Но очевидно только печатает NINA.

1
ответ дан 3 July 2014 в 21:54

Из того, что я понимаю, Вы хотите отобразить строки, которые соответствуют этому условию:

Каждая строка содержит два маркера "K" в любом столбце, и следующая строка содержит: "J" маркер в том же столбце первого "K" и "P" маркер в том же столбце второго "K"

Эта программа это делает то, в чем Вы нуждаетесь

     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];
           }   
        } 
     }

Сохраните в файле test.awk и попытке:

awk -f test.awk fileWithInputLine.txt
1
ответ дан 3 July 2014 в 21:54

Другие вопросы по тегам:

Похожие вопросы: