Возможна ли обработка Awk и нескольких файлов? - PullRequest
5 голосов
/ 14 декабря 2011

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

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

AAAAAAAAAAAA  1
BBBBBBBBBBBB  2
CCCCCCCCCCCC  3

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

XXXXXXXXXXX  3
YYYYYYYYYYY  2
ZZZZZZZZZZZ  1

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

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

Ответы [ 3 ]

6 голосов
/ 15 декабря 2011

Вы можете заставить 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.

6 голосов
/ 15 декабря 2011

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

[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
0 голосов
/ 15 декабря 2011

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

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

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

...