$ awk -F' ' '{ gsub(" ", ",", $1); $1 = $1 "," } 1' OFS=' ' file.txt
jan,Feb,Mar, Chennai India
jan,Feb,Mar, Hyderabad India
jan,Feb,Mar, Bangalore India
Здесь используется тот факт, что ввод может быть интерпретирован как два столбца, разделенных двойным -пробелом -. Он заменяет пробелы в первом столбце запятыми и добавляет запятую после них.
Вам не обязательно это делать. После использования exec
для помещения всего содержимого stdout в файл, просто сгруппируйте операторы, которые вы хотите поместить в терминал, и tee
в/dev/tty
exec > file.errout 2>&1
echo "messages only directed to the file"
{
echo "message i want directed to the terminal and file" ;
echo "more more message i want directed to the terminal and file" ;
} | tee /dev/tty
echo "more messages only directed to the file"
Вам не нужно exec >/dev/tty
каждый раз, потому что в силу вашей начальной строки exec
весь стандартный вывод записывается в файл.
В bash и zsh вы можете попробовать что-то подобное:
exec >file.errout 2>&1
#...
exec {foo}>&1 > >(tee /dev/tty) 2>&1 # temporarily redirect
echo bla
ls no_such_file
exec >&$foo 2>&1 # restore
#...
Перенаправление/восстановление exec {var}>&1... exec >&$var
похоже на exec 7>&1.. exec >&7
, только этот bash сам получит неиспользуемый файловый дескриптор и сохранит его в переменной $var
, вместо того, чтобы использовать какое-то фиксированное число, которое может конфликтовать с остальным кодом. Эта форма перенаправления является расширением ksh, также поддерживаемым в bash и zsh.
Комбинация exec > >(...)
перенаправление + подстановка процесса хоть и практична, но подвержена некоторым странностям и ошибкам (и может не работать в ksh93 ).
Конечно, вы можете сгруппировать команды в блок {...}
и перенаправить вывод всего блока в канал | tee /dev/tty
. Это самое простое и самое портативное.
Проблема в том, что любые назначения переменных будут происходить в подоболочке, а не в вашем основном скрипте:
a=before
{
a=$(pwd)
#...
} | tee /dev/tty
echo "$a" # still "before"