ОШИБКА KVM Не удается получить MTU интерфейса на 'kvmbr0': нет такого устройства

Сценарий выводит любую строку во втором файле, которая не встречается в первом файле.

awk 'NR==FNR { b[$0] = 1; next } !b[$0]' 1.txt 2.txt

Скрипт awkначинается со сравнения NRс FNR. NR— общее количество записей (строк ), прочитанных на данный момент, включая текущую запись. FNR— количество записей, считанных из текущего входного файла. Если эти два числа совпадают, то мы все еще читаем первый входной файл . Обратите внимание, что это нарушит , если первый файл окажется пустым , так как NR == FNRбудет верным и для второго файла.

Если мы читаем первый из входных файлов (, мы будем считать, что он не -пустой ), b[$0] = 1будет использовать содержимое текущей записи в качестве хеш-ключа и сохранить значение 1 для этого ключа в индексах массиваb(может быть строкой в ​​awk). Затем сценарий выполняет next, что означает возврат к началу сценария и чтение следующей записи.

Если NRравно , а не равно FNR, то это означает, что мы читаем второй из двух входных файлов, а !b[$0]является тестом с текущая входная запись (строка )в качестве ключа в массив b, который мы заполнили ранее. Если для текущей записи в bхранится 1, то мы знаем, что она ранее была найдена в первом файле. !отрицает тест.

Если проверка верна, т.е. если текущая строка из второго файла ранее не встречалась в первом файле, то выполняется действие по умолчанию. Действие по умолчанию для теста без соответствующего блока {...}— вывести текущую строку (, т. е. действует так, как если бы код был!b[$0] { print }).


Поскольку этот awkскрипт считывает в память все (уникальных )строк из первого файла,возможно, не стоит работать с очень большими файлами.

В таких случаях может быть лучше сделать что-то вроде

comm -13 <( sort -u file1 ) <( sort -u file2 )

(для этого требуется оболочка, которая знает о подстановках процессов )или просто

comm -13 file1 file2

если файлы уже отсортированы.

Это не генерирует точный такой же вывод, как скрипт awkбудет выводить любую строку из file2, которая встречается несколько раз один раз при каждом ее появлении, тогда как команда commвыше победила. 't, если на входе используется sort -u.

Дополнительную информацию см. в руководстве commк вашей системе.


Ответы на вопросы в комментариях:

  1. Да, FNR— это количество записей, считанных из текущего входного файла.
  2. NRи FNRне "принадлежат" ни к одному из файлов, это просто счетчики. Счетчик FNRсбрасывается при достижении конца файла.
  3. И NR, и FNRувеличиваются при чтении строки из файла. Команда nextвызывает переход к началу сценария, что также приводит к чтению следующей строки. NRи FNRувеличиваются этим действием, так как читается новая строка.
  4. Если NR != FNR, то это означает, что мы прошли первый файл. FNRсбрасывался на ноль по достижении конца предыдущего файла, но NRпросто продолжает считать.
  5. $0— это переменная, содержащая текущую строку. Он содержит полную строку, прочитанную из файла. $1, $2и т. д. содержат поля текущей строки, разделенные по значению переменнойIFS(обычно любой пробел ). Если текущая строка hello world, то $0будет иметь значение hello world, в то время как $1имеет значение hello, а $2имеет значение world(, поскольку строка была разделена на пробел ). ]. Этот сценарий использует только $0, и вы можете думать о $0как о «содержимом текущей строки ввода».
  6. b[$0] = 1— это присвоение значения определенному местоположению/индексу в массиве b. Местоположение определяется текущей строкой $0, а присвоенное значение равно 1. Это заставляет массив bдействовать как «таблица поиска»; если b[i]равен 1 для какого-либо конкретного индекса i, то это означает, что он был замечен в первом входном файле.
  7. !b[$0]будет истинным, если значение, сохраненное по индексу $0в b, равно нулю (или если оно не инициализировано ), т. е. если b[$0]никогда не присваивалось значение 1, т. е. строка, только что прочитанная из второй файл ранее не был замечен в первом файле. Так как нет действия (нет {...}блока ), соответствующего этому тесту, выполняется действие по умолчанию печати $0. Это приводит к печати каждой строки из второго файла, которой нет в первом файле.

0
21.11.2017, 14:25
0 ответов

Теги

Похожие вопросы