читати заданий діапазон рядків з файлу


15

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

Дякую за все.

linux  files  sed 

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 3має бути 7777, мабуть? Крім того, ви можете зробити if (( n >= 5555 ))для більш "природних" дивитися операторів порівняння чисел (і можливість залишити знак долара). І ти можеш зробити ((n++)).
Призупинено до подальшого повідомлення.


7

Будь-яке з них має працювати;

  • СЄПН -n ' startnumber , endnumber р'
  • awk 'NR> = startnumber && NR <= endnumber ' файл

Велике запитання до речі;)


1

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

x=$(( $k - $j + 1 ))
tail -n +$j filename | head -${x} 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.