Вопрос или проблема
У меня есть проблема с 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
Разбор скрипта:
-
Условие
$2 == "172.21.154.37"
: Эта часть скрипта проверяет, равен ли второй столбец искомому значению. -
{a=$1; $1=$2; $2=a}
: Если условие выполняется, то:- Сохраняем значение первого столбца в переменной
a
. - Меняем местами значения первого и второго столбцов.
- Сохраняем значение первого столбца в переменной
-
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
таким образом, вы можете быстро и эффективно обрабатывать текстовые файлы с данными. Это особенно полезно для администраторов систем, разработчиков и аналитиков данных, которые работают с большими объемами информации.
Если у вас есть больше вопросов или требуется дальнейшая помощь, не стесняйтесь обращаться!