Используя awk
, сопоставьте только те строки, которые не входят в сетку, т. е. values
в $1
и alarms
в $2
, и поменяйте местами значения столбцов. {..}1
re -строит всю строку с любыми изменениями внутри {..}
и любыми изменениями в разделителях поля/записи.
awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp }1' file |
column -t
Часть column -t
предназначена только для красивой печати вывода awk
. Вы можете использовать printf()
с соответствующей шириной, но предыдущая команда упрощает работу.
Но только для жалоб POSIX awk
используйтеprintf()
awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp; }
{ printf "%s%40s\n",$1,$2}' file
Если вы должны были внести изменения в строку -и использовать GNU awk
ниже 4.1.2, используйте временный файл для повторного -перенаправления содержимого из него
tmpfile=$(mktemp)
awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp }1' file |
column -t > "$tmpfile" && mv "$tmpfile" file
или используйте волшебный инструмент sponge
из пакета moreutils (В RHEL выполнитеyum install moreutils
)
awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp }1' file |
column -t |
sponge file
Не все команды существуют в виде отдельных исполняемых файлов, :некоторые команды могут быть встроены -в используемой вами оболочке.
Судя по всему, у вас не /usr/bin/which
установлен (, хотя некоторые пакеты в вашем дистрибутиве могут предоставить это ).
Ваши выходные данные type which
показывают, что команда which
в bash
на самом деле является псевдонимом, и этот псевдоним определяется только тогда, когда bash
вызывается как интерактивная оболочка. Это означает, что он, вероятно, определен в /etc/bash.bashrc
или ~/.bashrc
или в каком-то скрипте, взятом из одного из них.
При выполненииbash
не -в интерактивном режиме (, как в bash -c "type which"
, например ), /etc/bash.bashrc
и ~/.bashrc
будут пропущены, поэтому псевдоним не будет определен.
_which
, в свою очередь, может быть функцией оболочки. Вы можете увидеть его определение с помощью type _which
. Возможно, это что-то похожее на это:
which() {
IFS=:
for x in $PATH; do
if [ -x "$x/$1" ]; then
echo "$x/$1"
return 0
fi
done
echo "$1 not found in \$PATH"
return 1
}
Таким образом, если вы хотите добиться максимальной переносимости вашего скрипта, было бы неплохо использовать подобную функцию, и пусть скрипт несет в себе собственную версию which
.