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终端在新行上带有>
符号,就像我需要输入另一个命令来完成循环一样。我可以'弄清楚这个循环有什么问题。好像它完整了。看到我犯的任何错误?感谢。
答案 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"
希望这有帮助!