2017-03-09 70 views
1

我有一个脚本,需要在每个值上运行。它基本上采取的参数返回一个数字,像下面在awk中运行命令并将结果存储到位

>>./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作为参数。我需要脚本的输出作为第三列添加到输出中。

预期的输出是

123,4832,1100 
456,4833,17 
789,4834,42 

其中,第三字段是从myscript具有第二场作为参数的输出。

+0

我不清楚'$ 2'是什么意思。第一个命令行参数是'$ 1',但Awk变量'$ 1'与shell变量'$ 1'截然不同,意味着完全不同。你能否澄清一下你期望在这里发生什么? – tripleee

+1

另请注意[无用的'cat'](http://www.iki.fi/era/unix/award.html) – tripleee

+0

我希望my.csv文件中的第二个字段值作为参数我的脚本并将脚本的结果保存为my.csv中的第3个字段 – pythonRcpp

回答

0

您需要分别指定$2在字符串连接,这是

awk -F',' '{ system("echo \"echo " $1 "$(../myexecutable " $2 ") " $3 "\" | bash"); }' my.csv 
+0

它给了我'127100 4832155200921276976 :没有这样的文件或目录.ter4832155200921276984' Myscript返回在换行答案(应该是一个问题?)。 127100和4 ... 6是我的2列值my.csv – pythonRcpp

+0

基本原因是您的问题未能指定您实际需要的内容。但是'system(“echo”)'可能不是任何问题的好答案。 – tripleee

+0

将'$ 2'放在双引号之外的基本建议是现成的,但是, – tripleee

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 
+0

这给了我只有我的脚本的结果。 脚本值(我的脚本输出是换行符,我不知道这是一个问题) – pythonRcpp

+0

它不打印$ 1,$ 2但v(以空格为前缀) – pythonRcpp

+0

向我们展示您的预期输出问题 –

0

从GNU awk的在线文档:

系统:执行操作系统命令的命令,然后返回到awk程序。返回命令的退出状态(详见下文)。

你需要使用函数getline getline piped documentation

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 

我假设你需要用逗号分隔输出;改变这个空间分隔显然是一个微不足道的修改。

+0

它返回我,outputbyscript我试着运行'while IFS =,读-r第一秒;做printf“%s,%s”,“$ first”“$ second”;完成 pythonRcpp

+0

是的,你没有提供给第三个字段*和换行符的'myscript',正如我试图解释的那样。如果你想要'printf'的换行符,那就是'printf'%s,%s,\ n“”$ first“”$ second“'但是......我真的无法猜测你想在哪里使用这个。 – tripleee

+0

不,我只是试图在不调用脚本的情况下检查命令,它应该已经打印出第1列2 – pythonRcpp

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

+0

它只打印来自我的脚本的输出。要模拟而不是myscript运行任何可以接受1个参数的bash命令 – pythonRcpp

+0

我发布的脚本** DOES **将'myscript'的stdout保存到名为'val'的变量中。如果没有发生,那么你要么复制/粘贴不正确,要么'myscript'的输出不会执行stdout。尝试将调用改为'“./myscript \ 047”$ 2“\ 047 2>&1”来查看它的输出是否会改为stderr。 –

相关问题