У меня есть файл, содержащий 100000 строк, как я могу получить строки из строки # 5555 в строку # 7777 под Linux.
Спасибо за все.
sed '5555,7777!d' <filename>
Это напечатает строки 5555-7777 файла включительно.
Деннис написал следующее, что, я согласен, должно быть быстрее:
sed '5555,7777p; 7778q' filename
Следующее свидетельство того, что это должно быть быстрее:
$ n=1
$ while [[ n -le 100000 ]]; do echo $n >> sedtest2; n=$((n + 1)); done
$ strace -e trace=read -o sed1 sed '5555,7777!d' sedtest2
$ strace -e trace=read -o sed2 sed '5555,7777p; 7778q' sedtest2
$ wc -l sed1
149 sed1
$ wc -l sed2
14 sed1
Только в Bash (для развлечения):
n=1
while read line; do
if [[ ($n -ge 5555) && ($n -le 7777) ]]; then
echo $line
elif [[ $n -gt 7777 ]]; then
break
fi
n=$(( $n + 1 ))
done < file
Завершение работы, когда вы закончите, может ускорить процесс:
sed -n '5555,7777p; 7778q' input_file
Любой из них должен работать;
Кстати, отличный вопрос;)
Я обнаружил, что опция sed не работает с файлом mysqldump, я полагаю, из-за обработки цитируемых переводов строк или многобайтовых символов. голова и хвост нарезают его, используя те же номера строк, что и grep, что мне и нужно. Чтобы получить строки с $ j по $ k, вам необходимо:
x=$(( $k - $j + 1 ))
tail -n +$j filename | head -${x}