читать указанный диапазон строк из файла

15

У меня есть файл, который содержит 100000 строк, как я могу получить строки из строки # 5555 в строку # 7777 в Linux.

Спасибо за все.


источник
1
@ibrahim, подумайте о том, чтобы принять ответ Кайла (отметив зеленую галочку слева), если он вам помог
Jonik
Вы можете точно указать, хотите ли вы использовать sed или другие инструменты в порядке.
Ману Х
Немного исследований бросает по крайней мере stackoverflow.com/questions/83329/…
sancho.s Восстановите Монику

Ответы:

22
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
Кайл Брандт
источник
Я думаю, что ваш $n -gt 37777 может быть? Кроме того, вы можете if (( n >= 5555 ))использовать более «естественно» выглядящие операторы сравнения чисел (и возможность опускать знак доллара). И вы можете сделать ((n++)).
Приостановлено до дальнейшего уведомления.
16

Выход, когда вы закончите, может ускорить процесс:

sed -n '5555,7777p; 7778q' input_file
Приостановлено до дальнейшего уведомления.
источник
1
+1, должно быть быстрее, обновил мой пост, чтобы показать почему.
Кайл Брандт
7

Любой из них должен работать;

  • sed -n ' startnumber , endnumber p'
  • awk 'NR> = начальный номер && NR <= конечный номер '

Отличный вопрос, кстати;)

Chopper3
источник
1

Я обнаружил, что опция sed не работает с файлом mysqldump, я полагаю, из-за обработки заключенных в кавычки переводов строки или многобайтовых символов. голова и хвост нарезают его, используя те же номера строк, что и grep, что мне и было нужно. Чтобы получить строки от $ j до $ k, вам нужно:

x=$(( $k - $j + 1 ))
tail -n +$j filename | head -${x} 
Дейв Крук
источник