我写了以下脚本。它没有给出任何错误。
但它也没有创建任何输出文件
for i in cat list
do
a=awk '{if ($1 == "H") print $0;}' $i
b=awk '{if ($1 == "D") print $0;}' $i
c=$(wc -l < $i)
d=expr $c - 1`
e=sed -n '$c'p`
f=sed -n '$d'p`
printf "$a $b $e $f\n" >> output.txt
done
答案 0 :(得分:1)
你的命令:
for i in cat list; do echo $i; done
只打印cat
和list
作为输出。
如果您只想为每行文件list
运行循环,请使用:
while read l
do
echo "$i"
# repalce echo with your actual script commands and keep "$i" in double quotes
done < list
答案 1 :(得分:0)
假设你真的需要反击,并考虑Anubhava的修正,剩下的主要问题是sed
不会将$c
视为shell变量的值 - 你需要加倍在此上下文中引用,以使shell在sed
看到它之前扩展变量的值。
while read -r i; do
a=$(awk '{if ($1 == "H") print $0;}' "$i")
b=$(awk '{if ($1 == "D") print $0;}' "$i")
c=$(wc -l < "$i")
d=$(expr "$c" - 1)
e=$(sed -n "${c}p")
f=$(sed -n "${d}p")
printf "$a $b $e $f\n"
done <file >>output.txt
还要注意在变量名称周围明智地使用双引号,以及重构输出重定向。如果您要覆盖output.txt
而不是附加,请使用单个>
。
这仍然不是一个漂亮的脚本,但如果不了解实际问题和所需的输入和输出,很难说如何改进它。根据它的一般外观,完全用Awk重写它可能是一个好主意。