我目前有两个用 C 编写的程序,名为“删除”和“计算”。
当我调用 ./remove 时,它会从标准输入中删除一些数据。当我调用 ./calculate 时,它接受一个参数以及来自标准输入的数据并计算并返回一个值。
目前正在编写一个调用这两个程序的脚本。
我用以下内容调用我的脚本:
./calc.sh input.txt 2 3 4 5
其中 input.txt 有:
abcd:1,2:3,4
efgh:5,4:4,4
hijk:3,1:4,9
运行 ./remove 程序返回
abcd:1,2:3,4
efgh:5,4:4,4
我的脚本目前是:
./remove "$1" | ./calculate "$1" "$2" "$3" "$4" < awk -F ':,' '
如何修复脚本,以便从 ./remove 程序返回的整数列中选择值,并将其逐行提交到 ./calculate 作为 stdin 以及带有参数的“2 3 4 5”?
答案1
如果我正确理解你的目标,那么你已经很接近了。尝试
#!/bin/sh
filename=$1
shift
./remove "$filename" | awk -F '[:,]' '{print $2, $3, $4, $5}' | ./calculate "$@"
你需要说-F '[:,]'
因为每个字段分隔符是任何一个一个:
或,
。
awk -F ':,'
期望字段分隔符是 string :,
,如下所示
field1:,field2:,field3
该shift
命令从参数列表中删除$1
(即文件名),并扩展为、、和。input.txt
"$@"
2
3
4
5
答案2
尝试
./remove $1 | awk -F '[:,]' '{ printf "./calculate %d %d %d %d\n",$2,$3,$4,$5 }' | bash
在哪里
awk
将生成命令行到标准输出- 并将其提供给
bash
(或任何 shell )
你可以通过简单地运行来测试
./remove $1 | awk -F '[:,]' '{ printf "./calculate %d %d %d %d\n",$2,$3,$4,$5 }'
然而,
当我调用 ./calculate 时,它接受一个参数以及来自标准输入的数据并计算并返回一个值。
你能解释一下必须提供什么输入吗./calculate
?在上面的构造中,我假设计算不使用输入。