运行时的脚本
./program < "$1" | awk -F '!' '{print $3 $4, $5, $6, $7}
返回值
900 200 30 400 5
51 31 2 3 4
如何为每一行的colummns设置变量 我试过了
LINE=`./program < $1`
for i in $LINE
do
$LINE | awk -f '!' | read a b c d e <<< "$(echo $i | cut -f4 -d:}'
但无论我怎么做,我似乎都无法将值变为变量
答案 0 :(得分:1)
您可以使用流程替换为awk
的每一行输出读取这些值:
while read -r a b c d e; do
echo "<$a><$b><$c><$d><$e>"
done < <(./program < "$1" | awk -F '!' '{print $3 $4, $5, $6, $7}')
事实上,由于awk
仅打印由!
分隔的列,因此您甚至可以完全删除awk:
while IFS='!' read -r a b c d e; do
echo "<$a><$b><$c><$d><$e>"
done < <(./program < "$1")
答案 1 :(得分:0)
for i in $LINE
将遍历LINE中的标记。您可以修改IFS以使令牌等于一行,但您也可以
./program <"$1" |
while IFS='!' read -r a b c d e f g _; do
echo "<$c$d><$e><$f><$g>"
done
您尝试的其他问题:
LINE
不是一个好的变量名。使用小写变量名;大写应视为shell的特殊变量保留。
您的进程替换尝试在循环外使用循环变量$i
,但这是不可能的;它将是未定义的。
LINE
不是命令名称,因此其标准输出无法通过管道传输到awk
。要将字符串传递给Awk,请执行echo "$LINE" | awk
或仅在Bash中使用此字符串:<<<"$LINE" awk
您有一个双重定向到read
。它无法读取管道和此处字符串的标准输入;这里的字符串将获胜。但在这种情况下,因为read
位于管道的末尾,所以它将在子shell中运行,并在子shell退出时丢失其值。 (你可以在Bash中避免这种情况。请参阅http://mywiki.wooledge.org/BashFAQ/024进行讨论。)
您在$(echo ... | cut ... }
你应该在echo "$i"
中引用字符串(尽管在这个孤立的情况下,它实际上可能有效)。通常,除非您明确要求shell对变量的值执行通配符扩展和标记拆分,否则应该对其进行双引号。
没有done
关闭for ...; do
阻止。