Мне нужна помощь с простым скриптом 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
Есть ли способ сделать это, не обращаясь к конкретный столбец / поле?
Я не знаю то, что Вы имеете против именованных столбцов. Если Вы хотите определить то, что находится в них, необходимо вызвать их конкретно.
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
.
Из того, что я понимаю, Вы хотите отобразить строки, которые соответствуют этому условию:
Каждая строка содержит два маркера "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