我有一个脚本需要在每个值上运行。它基本上通过参数返回一个数字,如下面的
>>./myscript 4832
>>1100
my.csv
包含以下内容:
123,4832
456,4833
789,4834
我的命令
cat my.csv | awk -F',' '{$3=system("../myscript $2");print $1,$2,$3'}
myscript
无法理解我将第二个输入字段$2
作为参数传递。我需要将脚本的输出作为我的第3列添加到输出中。
预期输出
123,4832,1100
456,4833,17
789,4834,42
其中第三个字段是myscript
的输出,第二个字段作为参数。
答案 0 :(得分:1)
如果您尝试使用myscript $2
的输出添加第三个字段,其中$2
是第二个字段的值,请尝试
awk -F , '{ printf ("%s,%s,", $1, $2); system("../myscript " $2) }' my.csv
我们利用这样一个方便的事实:myscript
的输出将完成输出而没有带有计算值和换行符的换行符。
这对Awk来说并不是很好用;你不妨做什么
while IFS=, read -r first second; do
printf "%s,%s," "$first" "$second"
../mycript "$second"
done <my.csv
我假设你需要以逗号分隔的输出;把它改成空格分离显然是一个微不足道的修改。
答案 1 :(得分:0)
您需要在字符串连接中单独指定$2
,即
awk -F',' '{ system("echo \"echo " $1 "$(../myexecutable " $2 ") " $3 "\" | bash"); }' my.csv
答案 2 :(得分:0)
我们可以在gnu-awk Two-Way Communications with Another Process
中使用awk -F',' '{"../myscript "$2 |& getline v; print $1,$2,v}' my.csv
你明白了,
123 4832 1100 456 4833 17 789 4834 42
awk -F',' 'BEGIN { OFS=FS }{"../myscript "$2 |& getline v; print $1,$2,v}' my.csv
你明白了,
123,4832,1100 456,4833,17 789,4834,42
答案 3 :(得分:0)
来自GNU awk在线文档:
system:执行操作系统命令命令,然后返回awk程序。返回命令的退出状态(参见下文)。
您需要使用getline getline piped documentation
答案 4 :(得分:0)
您想要的语法是:
awk 'BEGIN{FS=OFS=","}
{
cmd = "./myscript \047" $2 "\047"
val = ( (cmd | getline line) > 0 ? line : "NaN" )
close(cmd)
print $0, val
}
' file
如果您愿意,请调整getline部分以执行不同的错误处理,并确保在使用getline之前阅读并完全理解http://awk.freeshell.org/AllAboutGetline。