【问题标题】:pipe awk output into c program管道 awk 输出到 c 程序
【发布时间】:2014-02-04 11:16:38
【问题描述】:

您好,我编写了一个输入 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 程序中?

谢谢

【问题讨论】:

  • done; | 更改为done |

标签: c awk terminal pipe


【解决方案1】:

当您真正尝试理解 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)。我的是“懒惰的答案”。 ;)
  • @mbratch 你的很公平,通常我不会走这么远,但糟糕的脚本真的让我很困扰,我只是有心情......感谢投票,我很感激!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多