繁体   English   中英

在UNIX中使用AWK处理行时出现问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM