Команда awk для условного сравнения 2 последовательных строк с разными столбцами - PullRequest
0 голосов
/ 25 февраля 2019

Это мой пример входного файла:

xxxxx,12345,yy,ABN,ABE,47,20171018130030,122021010147421,2,IN,3,13,9741588177,32
xxxxxx,9741588177,yy,ABN,ABE,54,20171018130030,122025010227014,2,IN,3,15,12345,32

Я хочу сравнить 2 последовательные строки в этом файле с этим условием:

  1. 12-е поле 1-й строки и12-е поле 2-й строки должно быть 13 и 15 соответственно.
  2. Если выполнены условия в точке 1, то 2-е поле строки 1 (значение 12-го поля равно 13) должно совпадать с 13-мполе строки 2 (которое имеет 12-е поле как 15).

Файл содержит много таких строк, где вышеуказанное условие не выполняется, я хотел бы напечатать только те строки, которые удовлетворяют условиям 1 и2.

Любая помощь в этом отношении очень ценится!

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

еще awk

$ awk -F, '$12==13 {p0=$0; p2=$2; c=1; next} 
           c&&c-- && $12==15 && p2==$13 {print p0; print}' file

начать захват только тогда, когда начальное совпадение на $12 первой строки.

c&&c-- - это умный счетчик (отсчет здесь)), который остановится на 0 (из-за первого c перед амперсандом).У Эда Мортона есть пост с большим количеством примеров умных счетчиков

0 голосов
/ 26 февраля 2019

Хотелось бы, чтобы вы использовали еще несколько строк выборочного ввода и предоставили ожидаемый результат, поэтому мы не все просто догадываемся, но МОЖЕТЕ это то, что вы хотите сделать:

$ cat tst.awk
BEGIN { FS="," }
(p[12] == 13) && ($12 == 15) && (p[2] == $13) { print p[0] ORS $0 }
{ split($0,p); p[0]=$0 }

$ awk -f tst.awk file
xxxxx,12345,yy,ABN,ABE,47,20171018130030,122021010147421,2,IN,3,13,9741588177,32
xxxxxx,9741588177,yy,ABN,ABE,54,20171018130030,122025010227014,2,IN,3,15,12345,32
0 голосов
/ 25 февраля 2019

Непонятно, хотите ли вы сравнить строки в группах по 2 (т.е. сравнить строки 1 и 2, а затем строки 3 и 4) или последовательно (то есть сравнить строки 1 и 2, а затем 2 и 3),Для последнего:

awk 'NR > 1 && prev_12 == 13 && $12 == 15 && 
    prev_2 == $13 {print prev; print $0} 
    {prev=$0; prev_12=$12; prev_2=$2}' FS=, input-file

Для первого добавить условие NR % 2 == 0.(Я предполагаю, что вы хотели упомянуть, что поля разделены запятыми, что, судя по входным данным, имеет место.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...