Сравните текущую строку и следующую строку в awk

Я хочу найти шаблон, например: столбец 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» для обеих записей или только для последней?

James Brown 18.12.2020 17:31

Привет, Джеймс, столбец 4 — «CG» для обеих записей.

bobia9193 18.12.2020 17:36

Переверните свое мышление: сравните текущую строку с предыдущей строкой.

dawg 18.12.2020 17:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
476
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

РЕДАКТИРОВАТЬ (чтобы сравнить каждую строку с ее следующей строкой, используйте эту): добавление этого решения сейчас, с новыми образцами 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 18.12.2020 18:14

@ bobia9193, не могли бы вы обновить свой вопрос, указав эти детали для лучшего понимания здесь. Хотите сравнить 1st to 2nd, 3rd to 4th, 5th to 6th вот такие строчки? Или поставить лайк 1st to 2nd, 2nd to 3rd, 3rd to 4th и так далее? Пожалуйста, подтвердите один раз.

RavinderSingh13 18.12.2020 18:16

Спасибо за помощь! Как и мой комментарий к решению Джеймса: я новичок в этой области, поэтому хочу задать вам вопрос для более глубокого понимания. Какова структура этого awk? Есть ли там условие, НАЧАЛО, КОНЕЦ? Можете ли вы объяснить свой код о структуре awk? Еще раз спасибо!

bobia9193 18.12.2020 18:35

Давайте продолжим обсуждение в чате.

bobia9193 18.12.2020 18:37

@ bobia9193, теперь я добавил подробное объяснение моего решения EDIT, оно должно вам помочь. Чтобы узнать больше о awk, пожалуйста, проверьте ссылку stackoverflow.com/tags/awk/info, ура.

RavinderSingh13 18.12.2020 18:41
Ответ принят как подходящий

Человек, я понял, что совершенно неправильно в первую очередь. Надеюсь, на этот раз я правильно понял.

$ 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?

bobia9193 18.12.2020 18:27

Цитата из языка программирования AWK: каждая программа awk — это последовательность одного или нескольких операторов шаблонного действия: узоры [pattern { action }] в программе. - - Для каждого совпадающего шаблона выполняется соответствующее действие [if] - -.

James Brown 18.12.2020 22:43

Итак, начало этого решения можно было бы записать: { if ($2= = "G" && $4= = "CG" && p2= = "C" && p4= = "CG") print p ORS $0 }.

James Brown 18.12.2020 22:49

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