Я хочу найти шаблон, например: столбец 2 — «C» в текущей строке, а столбец 2 в следующей строке — «G». И столбец 4 файла - «CG». Я хочу сравнить 1-й со 2-м, 3-й с 4-м, 5-й с 6-м и так далее. Затем напечатайте пару текущей строки и следующей строки. Буква «С» может стоять как в четной, так и в нечетной строке.
Введите так:
chr1 C 10467 CHH CT 0.0 0 1
chr1 C 10469 CG CG 0.0 0 1
chr1 G 10470 CG CG 0.0 0 8
chr1 C 10471 CG CG 0.0 0 1
chr1 G 10472 CG CG 1.0 8 8
Ожидаемый результат, разделенный разделителем табуляции:
chr1 C 10469 CG CG 0.0 0 1
chr1 G 10470 CG CG 0.0 0 8
chr1 C 10471 CG CG 0.0 0 1
chr1 G 10472 CG CG 1.0 8 8
Мой код:
awk '{a=$2; c=$4; d=$0; e=NR; getline; f=$2; g=$4} {if (a == "C" && f == "G" && c == "CG" && g == "CG") {print d,e,"\n",$0,NR}}' input_file
Я использую getline и проверяю, есть ли «G» на следующей строке. Проблема в том, что если я это сделаю, awk сразу перейдет к третьей строке и пропустит некоторые строки. Например, входной столбец 2:
Line 1: G
Line 2: C
Line 3: G
Line 4: C
Ожидаемый результат — строка 2 и строка 3. Однако awk перешел непосредственно к третьей строке из первой строки, а не построчно. Так что выхода нет.
С уважением!
Привет, Джеймс, столбец 4 — «CG» для обеих записей.
Переверните свое мышление: сравните текущую строку с предыдущей строкой.
РЕДАКТИРОВАТЬ (чтобы сравнить каждую строку с ее следующей строкой, используйте эту): добавление этого решения сейчас, с новыми образцами OP.
awk '
FNR>1{
if (secCol= = "C" && $2= = "G" && fourthCol= = "CG" && $4= = "CG"){
print prevLine ORS $0
}
}
{
secCol=$2
fourthCol=$4
prevLine=$0
}
' Input_file
Объяснение: Добавлено подробное объяснение вышеизложенного.
awk '
##Starting awk program from here.
FNR>1{
##Checking condition if current line number is more than 1 then do following.
if (secCol= = "C" && $2= = "G" && fourthCol= = "CG" && $4= = "CG"){
##Checking condition if secCol is C AND 2nd column is G AND fourthCol is CG and 4th column is CG then do following.
print prevLine ORS $0
##Printing prevLine ORS and current line.
}
}
{
secCol=$2
##Creating secCol with 2nd column of current line.
fourthCol=$4
##Creating fourthCol with 4th column of current line.
prevLine=$0
##Setting prevLine to current line value.
}
' Input_file ##Mentioning Input_file name here.
Исходное решение (сравниваются все нечетные и четные строки): (образцы ОП стали более четкими после редактирования, но это решение также сохранено здесь для будущих читателей на случай, если оно поможет) Не могли бы вы попробовать выполнить следующие действия, написанные только в соответствии с показанными образцами. Это проверяет, имеет ли предыдущая строка 4-й столбец (fourthCol) тоже CG
или нет, если он вам не нужен, а затем удалите && foruthCol= = "CG"
из следующего.
awk '
FNR%2==0{
if (secCol= = "C" && $2= = "G" && fourthCol= = "CG" && $4= = "CG"){
print prevLine ORS $0
}
prevLine=secCol=fourthCol = ""
next
}
{
secCol=$2
fourthCol=$4
prevLine=$0
}
' Input_file
Вывод будет следующим.
chr1 C 10469 CG CG 0.0 0 1
chr1 G 10470 CG CG 0.0 0 8
chr1 C 10471 CG CG 0.0 0 1
chr1 G 10472 CG CG 1.0 8 8
Объяснение: Добавлено подробное объяснение вышеизложенного.
awk ' ##Starting awk program from here.
FNR%2==0{ ##Checking condition if line number is divided by 2 or not.
if (secCol= = "C" && $2= = "G" && fourthCol= = "CG" && $4= = "CG"){
##Checking condition if secCol is C AND 2nd column is G AND fourthCol is CG and 4th column is CG then do following.
print prevLine ORS $0 ##Printing prevLine ORS and current line.
}
prevLine=secCol=fourthCol = "" ##Nullifying prevLone, secCol, fourthCol here.
next ##next will skip all further statements from here.
}
{
secCol=$2 ##Creating secCol with 2nd column of current line.
fourthCol=$4 ##Creating fourthCol with 4th column of current line.
prevLine=$0 ##Setting prevLine to current line value.
}
' Input_file ##Mentioning Input_file name here.
@ RavinderSingh13 Спасибо. В моем случае этот код пропускает некоторые выходные данные, такие как мой код. FNR%2=0 - четная строка, этот код, работающий с 'C', появляется в нечетной строке. Когда 'C' появляется в четной строке, этот код пропустит часть вывода. Вы можете попробовать этот ввод: chr1 C 10467 CHH CT 0.0 0 1 chr1 C 10469 CG CG 0.0 0 1 chr1 G 10470 CG CG 0.0 0 8 chr1 C 10471 CG CG 0.0 0 1 chr1 G 10472 CG CG 1.0 8 8
@ bobia9193, не могли бы вы обновить свой вопрос, указав эти детали для лучшего понимания здесь. Хотите сравнить 1st to 2nd, 3rd to 4th, 5th to 6th
вот такие строчки? Или поставить лайк 1st to 2nd, 2nd to 3rd, 3rd to 4th
и так далее? Пожалуйста, подтвердите один раз.
Спасибо за помощь! Как и мой комментарий к решению Джеймса: я новичок в этой области, поэтому хочу задать вам вопрос для более глубокого понимания. Какова структура этого awk? Есть ли там условие, НАЧАЛО, КОНЕЦ? Можете ли вы объяснить свой код о структуре awk? Еще раз спасибо!
Давайте продолжим обсуждение в чате.
@ bobia9193, теперь я добавил подробное объяснение моего решения EDIT, оно должно вам помочь. Чтобы узнать больше о awk
, пожалуйста, проверьте ссылку stackoverflow.com/tags/awk/info, ура.
Человек, я понял, что совершенно неправильно в первую очередь. Надеюсь, на этот раз я правильно понял.
$ awk '
$2= = "G" && $4= = "CG" && p2= = "C" && p4= = "CG" {
print p ORS $0
}
{
p=$0
p2=$2
p4=$4
}' file
Выход:
chr1 C 10469 CG CG 0.0 0 1
chr1 G 10470 CG CG 0.0 0 8
chr1 C 10471 CG CG 0.0 0 1
chr1 G 10472 CG CG 1.0 8 8
Объяснение:
awk '
$2= = "G" && # the column 2 in current line is G
$4= = "CG" && # And the column 4 of file is CG
p2= = "C" && # the column 2 is C in a previous line
p4= = "CG" { # And the column 4 of file is CG
print p ORS $0 # Then print a couple of current line and next line
}
{
p=$0 # current record is previous on next round
p2=$2 # same goes for column 2
p4=$4 # and column 4
}' file
Сэр, я новичок в этой области, поэтому я хочу задать вопрос. Какова структура этого awk? Есть ли там условие? Можете ли вы объяснить свой код о структуре awk?
Цитата из языка программирования AWK: каждая программа awk — это последовательность одного или нескольких операторов шаблонного действия: узоры [pattern { action }
] в программе. - - Для каждого совпадающего шаблона выполняется соответствующее действие [if
] - -.
Итак, начало этого решения можно было бы записать: { if ($2= = "G" && $4= = "CG" && p2= = "C" && p4= = "CG") print p ORS $0 }
.
столбец 4 файла - это «CG» для обеих записей или только для последней?