awk语法,用于从文件中读取参数来调用函数

时间:2014-03-29 11:36:52

标签: unix

我有一个功能

xyz()
{
x=$1*2
echo x
}

然后我想用awk替换csv文件中的特定列。

档案input.csv

abc,2,something    
def,3,something1

我希望输出如下:

abc,4,somthing    
def,6,something1

使用的命令:

cat input.csv|awk -F, -v v="'"`xyz "$2""'" 'BEGIN {FS=","; OFS=","} {$2=v1; print $0}'

打开文件input.csv,通过传递第二个文件作为参数调用函数xyz,结果存储回文件的第2位,但是不工作!

如果我在调用函数时使用常量代替$ 2,那么它可以工作:

请帮我这样做。

cat input.csv|awk -F, -v v="'"`xyz "14""'" 'BEGIN {FS=","; OFS=","} {$2=v1; print $0}'

通过调用xyz函数并将结果返回到文件input.csv的2 nd 列,上面的代码行正常工作,但只有14 * 2 ,因为14被视为常数。

1 个答案:

答案 0 :(得分:2)

您的命令行中缺少后退引用,UUOC(Cat的无用使用)以及命令行中的变量v和{中的v1之间不匹配{1}}计划:

awk

应该使用cat input.csv|awk -F, -v v="'"`xyz "$2""'" 'BEGIN {FS=","; OFS=","} {$2=v1; print $0}' ^ Here ^ Here ^ Here 代替:

$(…)

但这会让你遇到问题;在开始运行awk -F, -v v="'$(xyz "$2")'" 'BEGIN {FS=","; OFS=","} {$2=v; print $0}' input.csv 脚本之前,shell会调用函数xyz,而awk永远不会调用它。你根本无法做到这一点。但是,您可以在awk(并在运行中)中定义您的功能:

awk

对于您的双行输入文件,它会产生您想要的输出。