[英]Issue while processing a line using awk in unix
我在文件的每一行上运行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:2
(而不是 /home/mjain8:1:2 3
)。 那就是输出只包含空格前的行。
有人可以指出我在做什么错。 另外,如果您有使用其他命令的建议,也请告知我。 自最近两天以来,我一直在努力使用awk进行相同操作。
我想使其具有可移植性,以便它可以在尽可能多的外壳上运行。
使用shell的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"
搭配Perl-one衬纸,您也可以轻松完成
> 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
>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.