管awk输出到c程序

时间:2014-01-15 19:42:07

标签: c awk terminal pipe

您好我编写了一个以3个整数作为输入的c程序:

./myprogram 1 2 3

我的目标是将数据从csv文件传输到c程序​​的输入。我使用以下方法从c程序中获取每一行:

for i in $(seq 1 `wc -l "test.csv" | awk '{print $1}'`); do sed -n $i'p' "test.csv"; done;

然后想把它的输出传递到我的c程序中。我试过了:

for i in $(seq 1 `wc -l "test.csv" | awk '{print $1}'`); do sed -n $i'p' "test.csv"; done; | ./myprogram

然而我得到了:

Line 
bash: syntax error near unexpected token `|'

如何将输出传输到我的c程序中?

由于

2 个答案:

答案 0 :(得分:2)

当您真正尝试理解shell为您提供的错误消息时,它会有所帮助:

Line 
bash: syntax error near unexpected token `|'

如果您考虑一下,当您在管道中将命令链接在一起时,;之前永远不会有|,例如:

ls | wc -l
# and not: ls; | wc -l

;之后发生的任何事情就像一个独立的新命令,就像你在一个全新的,清晰的命令行上输入它一样。如果在清除命令行上键入| hello,则会得到完全相同的错误,因为这与脚本中的; | ...完全相同,例如:

$ | hello
-bash: syntax error near unexpected token `|'

其他人已经回答了这个问题,但我也想催促你在剧本中进行其他改进:

  1. 始终使用$()代替反引号,例如:

    for i in $(seq 1 $(wc -l "test.csv" | awk '{print $1}')); ...
    
  2. 你不需要那里的awk,这也可行:

    for i in $(seq 1 $(wc -l "test.csv")); ...
    
  3. 您可以将整个脚本简化为此,效果相同:

    ./myprogram < test.csv
    

答案 1 :(得分:1)

在shell中,它不喜欢显式行终止后跟管道(|)。管道已经分隔命令。所以你想要:

for i in $(seq 1 `wc -l "test.csv" | awk '{print $1}'`); do sed -n $i'p' "test.csv"; done | ./myprogram