обменять совпадающие столбцы

Вопрос или проблема

У меня есть проблема с awk, мне нужна ваша помощь, я просто хочу произвести grep по второму столбцу, и если есть совпадение, поменять местами второй столбец с первым.

172.21.154.40 172.21.254.25
172.21.250.94 172.21.154.37
172.21.250.93 172.21.254.24

Мой awk скрипт:

awk '$2 == "172.21.154.37"' $outputfile 

Затем поменять местами 172.21.250.94 с 172.21.154.37

Кто-нибудь может помочь? Спасибо.

В awk это можно сделать следующим образом:

awk '$2 == "172.21.154.37" {a=$1;$1=$2;$2=a}1' input.file

Одна из идей, где мы переопределяем $0, если находим совпадение:

$ awk '$2 == "172.21.154.37" { $0 = $2 OFS $1 } 1' file.dat
172.21.154.40 172.21.254.25
172.21.154.37 172.21.250.94
172.21.250.93 172.21.254.24

ЗАМЕТКИ:

  • отдельно стоящая 1 является эквивалентом ‘true’ в awk и, по сути, говорит о том, чтобы распечатать текущую строку (что в данном случае означает, что мы распечатываем все строки)
  • по умолчанию OFS – это пробел; если разделитель входных данных отличается от пробела (например, 3 пробела) и вы хотите сохранить исходное расстояние, тогда мы могли бы добавить немного кода, но на этом этапе одного пробела, похоже, достаточно для сопоставления с вашим образцом входных данных

Давайте KISS!

awk '$2 == "172.21.154.37"{print $2, $1; next} 1' file

Это то же самое, что и:

awk '$2 == "172.21.154.37"{print $2, $1; next} {print}' file

В псевдокоде:

if $2 is_equal to "172.21.154.37"
then print $2 $1
else print $0

Ответ или решение

Для решения задачи замены столбцов в файле с использованием утилиты awk, можно использовать следующий скрипт. Предположим, у нас есть файл, содержащий IP-адреса, записанный в виде двух столбцов, как показано ниже:

172.21.154.40 172.21.254.25
172.21.250.94 172.21.154.37
172.21.250.93 172.21.254.24

Задача

Необходимо выполнить поиск по второму столбцу, и если находящийся там адрес соответствует 172.21.154.37, то необходимо поменять местами значения первого и второго столбцов.

Решение

Для достижения этого результата можно применить следующий скрипт awk:

awk '$2 == "172.21.154.37" {a=$1; $1=$2; $2=a} 1' input.file

Разбор скрипта:

  1. Условие $2 == "172.21.154.37": Эта часть скрипта проверяет, равен ли второй столбец искомому значению.

  2. {a=$1; $1=$2; $2=a}: Если условие выполняется, то:

    • Сохраняем значение первого столбца в переменной a.
    • Меняем местами значения первого и второго столбцов.
  3. 1: Это сокращенная форма записи, которая всегда истинна, и в awk означает вывод текущей строки. Таким образом, происходит печать строки, как до, так и после возможной замены.

Пример использования

Допустим, файл называется input.file. Далее нам нужно выполнить команду в терминале:

awk '$2 == "172.21.154.37" {a=$1; $1=$2; $2=a} 1' input.file

Результат

После выполнения скрипта вы получите следующий вывод:

172.21.154.40 172.21.254.25
172.21.154.37 172.21.250.94
172.21.250.93 172.21.254.24

Дополнительные примечания

  • Стандартный вывод: При использовании вышеуказанного скрипта, если в вашем файле содержится больше данных, все строки будут выведены в одинаковом формате.
  • Метод next: Можно также использовать метод next, чтобы избежать повторного вывода строки с уже измененными значениями. Например:
awk '$2 == "172.21.154.37" {print $2, $1; next} {print}' input.file
  • OFS (Output Field Separator): Если ваши данные разделены не пробелами, а, например, табуляцией или несколькими пробелами, дополнительно можете задать OFS, чтобы сохранить форматирование.

Заключение

Используя awk таким образом, вы можете быстро и эффективно обрабатывать текстовые файлы с данными. Это особенно полезно для администраторов систем, разработчиков и аналитиков данных, которые работают с большими объемами информации.

Если у вас есть больше вопросов или требуется дальнейшая помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...