我有一个功能
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被视为常数。
答案 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
对于您的双行输入文件,它会产生您想要的输出。