Возможна ли обработка Awk и нескольких файлов?

Мне нужно обработать содержимое двух файлов. Мне было интересно, сможем ли мы осуществить это с помощью одного оператора nawk.

Содержимое файла А:

AAAAAAAAAAAA  1
BBBBBBBBBBBB  2
CCCCCCCCCCCC  3

Содержимое файла Б:

XXXXXXXXXXX  3
YYYYYYYYYYY  2
ZZZZZZZZZZZ  1

Я хотел бы сравнить, является ли $2 (2-е поле) в файле A обратным $2 в файле B. Мне было интересно, как написать правила в nawk для обработки нескольких файлов? Как бы мы отличили $2 A от $2 B

РЕДАКТИРОВАТЬ: мне нужно сравнить $2 первой строки A (которая равна 1) с $2 последней строки B (которая снова равна 1). Затем сравните $2 строки 2 в A с $2 в NR-1-й строке B. И скоро.....


person tomkaith13    schedule 14.12.2011    source источник
comment
отредактируйте свои данные так, чтобы по крайней мере в одной строке $2 были обратными друг другу. Также отредактируйте, чтобы показать, какой результат вы ожидаете, учитывая ввод. Удачи.   -  person shellter    schedule 14.12.2011
comment
@shelter: привет ... Мне нужно сравнить, если 2 доллара в первой строке в A с 2 долларами в последней строке с B .. Ожидаемого результата нет. Вопрос в том, как выполнить это сравнение (если это вообще возможно)   -  person tomkaith13    schedule 15.12.2011
comment
@shelter: я добавил правку, чтобы помочь вам лучше понять проблему... надеюсь, это поможет... спасибо   -  person tomkaith13    schedule 15.12.2011


Ответы (3)


Вы можете сделать что-то вроде этого -

[jaypal:~/Temp] cat f1
AAAAAAAAAAAA  1
BBBBBBBBBBBB  2
CCCCCCCCCCCC  3
DDDDDDDDDDDD  4

[jaypal:~/Temp] cat f2
AAAAAAAAAAA  5
XXXXXXXXXXX  3
YYYYYYYYYYY  2
ZZZZZZZZZZZ  1

Решение:

awk '
NR==FNR {a[i++]=$2; next}
{print (a[--i] == $2 ? "Match " $2 FS a[i] : "Do not match " $2 FS a[i])}' FileB FileA
Match 1 1
Match 2 2
Match 3 3
Do not match 4 5
person jaypal singh    schedule 15.12.2011
comment
Аааа FNR!!... вот в чем фокус... Не знаю, для чего именно он используется... спасибо за это - person tomkaith13; 15.12.2011
comment
Пожалуйста. :) Да, когда вам нужно работать с более чем 1 файлом, тогда FNR пригодится. FNR похож на NR в том, что он хранит номера записей, но в отличие от NR он сбрасывается на 0 после того, как файл будет полностью прочитан. Таким образом, NR===FNR ограничивает конкретное действие над одним файлом, поэтому мы можем добавлять дополнительные действия только для работы со вторым файлом. - person jaypal singh; 15.12.2011
comment
Попался ... и с «следующим» вы продолжали следить за тем, чтобы условие «NR == FNR» всегда выполнялось, пока мы обрабатываем файл A. Это хорошо продуманное решение. Престижность - person tomkaith13; 15.12.2011
comment
Вы можете сократить этот код до awk 'NR==NFR{a[i++]=$2;next}a[--i]==$2{print "Match",a[i],a[i];next}{print "Do Not Match",a[i],$2}' f1 f2. - person mschilli; 02.09.2013
comment
Читает ли это содержимое файла в память? Если да, то есть ли способ сделать это без чтения содержимого файла в память? - person tommy.carstensen; 17.10.2013

Вы можете заставить awk обрабатывать файлы последовательно, но вы не можете легко заставить его обрабатывать два файла параллельно. Вы, вероятно, можете добиться эффекта при осторожном использовании getline, но «осторожно» — это рабочий термин.

Я думаю, что в этом случае с простыми файлами с двумя столбцами я бы предпочел использовать:

paste "File A" "File B" |
awk '{ process fields $1, $2 from File A and fields $3, $4 from file B }'

Вам нужно будет убедиться, что два файла находятся в правильном порядке и т. д.

Если ваш ввод более сложный, то это может работать не так хорошо, хотя вы можете выбрать символ, который разделяет данные из двух файлов с помощью paste -d'|' ..., чтобы использовать канал для разделения двух записей, и awk -F'|' '{ ... }', чтобы прочитать $1 как информацию из Файл A и $2 в качестве информации из файла B.

person Jonathan Leffler    schedule 15.12.2011
comment
работать с интерпретаторами и последовательным программированием довольно сложно, так как я привык иметь дело с C. Все, что нам нужно, это два указателя, и мы продолжаем сравнивать по смещению обряда... Спасибо за альтернативу :) - person tomkaith13; 15.12.2011

Думали ли вы о том, чтобы сделать что-то вроде следующего?

diff --brief <(awk '{print $2}' A) <(tac B | awk '{print $2}')

tac переворачивает строки файла B, и тогда вы можете сравнить два столбца.

person cmbuckley    schedule 15.12.2011