-1

I have written the following script. It is not giving any error.

But it is also not creating any output file

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
4

2 回答 2

1

你的命令:

for i in cat list; do echo $i; done

只会打印catlist作为输出。

如果您只想为每一行文件运行 for 循环,请list使用:

while read l
do
   echo "$i"
   # repalce echo with your actual script commands and keep "$i" in double quotes
done < list
于 2013-08-11T09:33:19.993 回答
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 重写它可能是一个好主意。

于 2013-08-11T10:51:11.493 回答