Заменить столбец в одном файле на столбец из другого, используя awk? - PullRequest
15 голосов
/ 21 октября 2011

У меня есть два файла:

f1:
111 aaa 444
222 bbb 555
333 ccc 666

f2:
111 333 000 444
222 444 111 555
333 555 555 666

Как заменить второй столбец в "f1" на третий столбец из "f2" с помощью awk?

1 Ответ

27 голосов
/ 21 октября 2011

попробовать:

awk 'FNR==NR{a[NR]=$3;next}{$2=a[FNR]}1' f2 f1

Выход:

111 000 444
222 111 555
333 555 666

Объяснение вышеуказанного кода:

  • FNR==NR позволяет работать с одним целым файлом за раз. В данном случае это файл f2. NR и FNR содержат номера строк с разницей FNR, сбрасываемой в 1, когда читается новый файл, где значение NR продолжает увеличиваться.
  • Пока мы работаем с файлом f2, мы создаем массив с именем a, используя номер строки (NR) в качестве key и третий столбец ($3) в качестве значения. next позволяет нам пропустить оставшуюся часть блока действий.
  • Как только файл f2 заканчивается, мы начинаем работать с файлом f1. Условие NR==FNR не станет ложным, поскольку FNR будет увеличиваться с 1, а NR - нет. Таким образом, будет обработан только второй блок действий {$2=a[FNR]}.
  • Что делает этот блок, так это повторно присваивает значение второго столбца значению массива путем поиска номера строки.
  • 1 в конце печатает строку. Возвращает true, а в awk true заявления приводят к печати строки.
  • f2 f1 - порядок файлов, определенных. Поскольку мы хотим создать массив из файла f2, мы ставим его первым.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...