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

时间:2018-11-12 04:44:58

标签: shell unix awk

我正在文件的每一行上运行realpath命令。文件的两个示例行是

for index,value in enumerate([2, 4, 0, 3]):
    df.loc[index,:] = df.loc[index,:].shift(value)

print(df)
     0    1    2    3    4   5
0  NaN  NaN  2.0  3.0  4.0 NaN
1  NaN  NaN  NaN  NaN  1.0 NaN
2  5.0  6.0  7.0  2.0  3.0 NaN
3  NaN  NaN  NaN  4.0  3.0 NaN

运行命令后,我期望以上两行输出:

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

我正在运行的awk命令为/home/mjain8:1:2 /home/mjain8:1:2 3

现在,当我在第一行运行命令时,它运行正常,并为我提供了所需的输出。但是对于文件的第2行(如上所示),输出为awk 'BEGIN{cmd="realpath "}{cmd$0|getline;print $0;}' FS=':' OFS=':'(并且 /home/mjain8:1:2)。那就是输出只包含空格前的行。

有人可以指出我在做什么错。另外,如果您有使用其他命令的建议,也请告知我。自最近两天以来,我一直在努力使用awk进行同样的操作。

我想使其易于携带,以便它可以在尽可能多的外壳上运行。

2 个答案:

答案 0 :(得分:2)

使用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"

答案 1 :(得分:0)

还可以使用Perl-one衬纸

[Java] Type mismatch: cannot convert from Collector<Object,capture#3-of ?,Map<Object,Object>> to Supplier<R>