您好我编写了一个以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程序中?
由于
答案 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 `|'
其他人已经回答了这个问题,但我也想催促你在剧本中进行其他改进:
始终使用$()
代替反引号,例如:
for i in $(seq 1 $(wc -l "test.csv" | awk '{print $1}')); ...
你不需要那里的awk
,这也可行:
for i in $(seq 1 $(wc -l "test.csv")); ...
您可以将整个脚本简化为此,效果相同:
./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