Проблема при обработке строки с использованием awk в unix - PullRequest
0 голосов
/ 12 ноября 2018

Я запускаю команду realpath в каждой строке файла. Две примерные строки файла:

$HOME:1:2
$HOME:1:2 3

Я ожидаю, что после выполнения моей команды будет выведено более двух строк:

/home/mjain8:1:2
/home/mjain8:1:2 3

Я запускаю команду awk: awk 'BEGIN{cmd="realpath "}{cmd$0|getline;print $0;}' FS=':' OFS=':'

Теперь, когда я запускаю команду в первой строке, она работает нормально и выдает мне желаемый результат. Но для строки 2 файла (показанной выше) выводом является /home/mjain8:1:2NOT /home/mjain8:1:2 3). То есть вывод содержит только строку перед пробелом.

Может кто-нибудь указать, что я делаю не так. Кроме того, если у вас есть предложение использовать любую другую команду, пожалуйста, дайте мне знать тоже самое. Я пытался сделать то же самое с помощью awk с последних 2 дней.

Я хочу сделать его переносимым, чтобы он мог работать на как можно большем количестве оболочек.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Также с Perl-one liner вы можете легко это сделать

> export HOME=/home/mjain8
> cat home.txt
$HOME:1:2
$HOME:1:2 3
>  perl -F: -lane ' {$F[0]=$ENV{HOME} ;print join(":",@F)  } ' home.txt
/home/mjain8:1:2
/home/mjain8:1:2 3
> perl -F: -lane ' {$F[0]=$ENV{HOME} if $F[0]=~/\$HOME/;print join(":",@F)  } ' home.txt # if you need to explicity check if it is HOME
/home/mjain8:1:2
/home/mjain8:1:2 3
>
0 голосов
/ 12 ноября 2018

С циклом while оболочки будет намного проще, пожалуйста, попробуйте следующее. У меня все работало нормально.

while IFS=':' read -r path rest
do
   real=$(realpath "$path")
   echo "$real:$rest"
done < "Input_file"

Приведенный выше код имеет переменную real, чтобы сначала иметь значение команды realpath, а затем выводит свои выходные данные вместе с переменной rest, в случае, если вы хотите напрямую напечатать их в соответствии с последующим использованием комментария тройника.

while IFS=':' read -r path rest
do
   echo "$(realpath "$path"):$rest"
done < "Input_file"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...