挂bash循环脚本?

时间:2013-09-13 09:58:07

标签: bash loops while-loop

varrr=0

while read line
do
    if [ $line -gt 500 -a $line -le 600 ]; then    # for lines 501-600
        echo $line >> 'file_out_${varrr}.ubi'
    fi
done << 'file_in_${varrr}.ubi'

file_in_${varrr}.ubi是一个大约1000行的文本文件。我想将501-600行打印到新文件。

运行此代码会使我的Ubuntu终端在新行上带有>符号,就像我需要输入另一个命令来完成循环一样。我可以'弄清楚这个循环有什么问题。好像它完整了。看到我犯的任何错误?感谢。

3 个答案:

答案 0 :(得分:1)

如果您只想打印501到600的行,为什么不使用以下内容?

awk 'NR>=501 && NR<=600' file_in > file_out

awk 'NR==n' myfile打印文件n的第myfile行。然后,您可以使用我在上面写的范围。

答案 1 :(得分:1)

你可以简单地使用sed。它是最简单的工具,比带有测试的while循环更清晰,更快。

varrr=0
sed -n 501,600p "file_in_${varrr}.ubi" >> "file_out_${varrr}.ubi"

或者

varrr=0
sed -n 501,600p "file_in_${varrr}.ubi" > "file_out_${varrr}.ubi"

如果要覆盖现有数据。

顺便说一句,你的循环中的错误是因为你没有使用计数器而是将你的行号与行本身进行比较。

varrr=0
counter=0
while read line; do
    (( ++counter ))
    [[ counter -gt 500 && counter -le 600 ]] && echo "$line"
done < "file_in_${varrr}.ubi" > "file_out_${varrr}.ubi"

值得注意的是,您需要将<用于输入而不是<<,并将变量放在双引号而不是单引号上。

答案 2 :(得分:1)

我只会回答您的具体问题:这是因为您使用的是heredoc <<符号,而不是重定向<。你的最后一行应为:

done < 'file_in_${varrr}.ubi'

(观察 <)。

但是你会意识到你有一些引用问题。所以,你的最后一行应该是:

done < "file_in_${varrr}.ubi"

(观察双引号 ")。

同样,请注意第6行中的引用。您应该改为:

echo "$line" >> "file_out_${varrr}.ubi"

"双引号 file_out_${varrr}.ubi

但是,这将不会像你期望的那样......也许这样做:

varrr=0
linenb=0
while IFS= read -r line; do
    ((++linenb))
    if ((linenb>500 && linenb<=600)); then    # for lines 501-600
        echo "$line" >> "file_out_${varrr}.ubi"
    fi
done < "file_in_${varrr}.ubi"

希望这有帮助!