Автор Тема: Bash - взимане на няколко реда от средата на текст файл  (Прочетена 1240 пъти)

PhrozenCrew

  • Напреднали
  • *****
  • Публикации: 51
    • Профил
Здравейте,

Случайно да се сещате за някоя команда на bash, която да може да извлече да речем 10 реда от файл, като почне от 5-я ред. Ползвал съм tail, cat, tac, head, но не се сещам те да имаха възможност да зададеш от кой ред да почне да чете. Почти съм убеден, че имаше някаква такава команда.
Интересуваме да се команда, защото искам да взимам отрязъци от файл, който е над 30 000 реда.

Благодаря ви предварително!

Активен

gizi_

  • Напреднали
  • *****
  • Публикации: 521
  • Distribution: Debian/Lenny, SLES/9-11
  • Window Manager: Gnome 2.22.3
    • Профил
На бързо това което се сещам...погледни awk с него можеш да правиш супер много неща:

От/До - ред 3 до ред 10
Код
GeSHi (Bash):
  1. awk 'NR == 3, NR == 10 { print }' filename
  2.  

от - текст, до - текст, по този начин може да "режеш" от редове който съдържат определен текст
Код
GeSHi (Bash):
  1. awk '/от/,/до/ { print }' filename
  2.  
« Последна редакция: Dec 05, 2009, 00:44 от VladSun »
Активен

PhrozenCrew

  • Напреднали
  • *****
  • Публикации: 51
    • Профил
На бързо това което се сещам...погледни awk с него можеш да правиш супер много неща:

От/До - ред 3 до ред 10
Код
GeSHi (Bash):
  1. awk 'NR == 3, NR == 10 { print }' filename
  2.  
...
Това е идеално! Благодаря!
« Последна редакция: Dec 05, 2009, 00:46 от VladSun »
Активен

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Цитат
[...]Случайно да се сещате за някоя команда на bash, която да може да извлече да речем 10 реда от файл, като почне от 5-я ред

AWK:

Код
GeSHi (Bash):
  1. awk 'NR==5{_=10}_&&_--' infile


Ако държиш да е с bash:

Код
GeSHi (Bash):
  1. c=0 b=5 e=$((b+9))
  2. while IFS= read -r; do
  3.  (($((++c)) >= $b)) && (($c <= $e)) &&
  4.    printf '%s\n' "$REPLY"
  5. done < infile
« Последна редакция: Dec 05, 2009, 00:45 от VladSun »
Активен

DNAeon

  • Напреднали
  • *****
  • Публикации: 20
    • Профил
    • WWW
Здравейте,

Случайно да се сещате за някоя команда на bash, която да може да извлече да речем 10 реда от файл, като почне от 5-я ред. Ползвал съм tail, cat, tac, head, но не се сещам те да имаха възможност да зададеш от кой ред да почне да чете. Почти съм убеден, че имаше някаква такава команда.
Интересуваме да се команда, защото искам да взимам отрязъци от файл, който е над 30 000 реда.

Благодаря ви предварително!

Код
GeSHi (Bash):
  1. $ cat -n testing.txt
  2.     1  line 1
  3.     2  line 2
  4.     3  line 3
  5.     4  line 4
  6.     5  line 5
  7.     6  line 6
  8.     7  line 7
  9.     8  line 8
  10.     9  line 9
  11.    10  line 10
  12.    11  line 11
  13.    12  line 12
  14.    13  line 13
  15.    14  line 14
  16.    15  line 15
  17.    16  line 16
  18.    17  line 17
  19.    18  line 18
  20.    19  line 19
  21.    20  line 20
  22.  

Извежда всичко между 5 и 10 ред - използвайки head и tail:
Код
GeSHi (Bash):
  1. $ head -10 testing.txt | tail +5
  2. line 5
  3. line 6
  4. line 7
  5. line 8
  6. line 9
  7. line 10
  8.  

Същото но използва sed:
Код
GeSHi (Bash):
  1. $ sed -n '5,10p' testing.txt
  2. line 5
  3. line 6
  4. line 7
  5. line 8
  6. line 9
  7. line 10
  8.  

Поздрави!
« Последна редакция: Dec 05, 2009, 00:45 от VladSun »
Активен

http://www.freebsd.org/ - The Power to Serve!
http://www.unix-heaven.org/ - Spread the Knowledge!
http://www.daemonforums.org/ - Don't Panic!

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Цитат
[...]да извлече да речем 10 реда от файл

Ако съм разбрал правилно питането, би трябвало да е:

Код
GeSHi (Bash):
  1. head -14 infile | tail +5

или

Код
GeSHi (Bash):
  1. sed -n 5,14p infile


Всъщност,
за големи файлове аз бих ги пренаписал така:

Код
GeSHi (Bash):
  1. sed 1,4d\;14q infile

Код
GeSHi (Bash):
  1. awk 'NR==15{exit}NR>=5' infile
« Последна редакция: Dec 08, 2009, 21:58 от radoulov »
Активен

DNAeon

  • Напреднали
  • *****
  • Публикации: 20
    • Профил
    • WWW
Цитат
[...]да извлече да речем 10 реда от файл

Ако съм разбрал правилно питането, би трябвало да е:

Код
GeSHi (Bash):
  1. head -14 infile | tail +5

или

Код
GeSHi (Bash):
  1. sed -n 5,14p infile

Да, правилно си разбрал. Това, което съм дал е просто пример, за това как да вземеш отрязъци от файл. Човек винаги може да го пригоди за това кои точно редове му трябват :)
« Последна редакция: Dec 05, 2009, 00:46 от VladSun »
Активен

http://www.freebsd.org/ - The Power to Serve!
http://www.unix-heaven.org/ - Spread the Knowledge!
http://www.daemonforums.org/ - Don't Panic!

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Цитат
Да, правилно си разбрал. Това, което съм дал е просто пример, за това как да вземеш отрязъци от файл. Човек винаги може да го пригоди за това кои точно редове му трябват :)

Извинявам се, ако съм прозвучал излишно педантичнен, постът ти е пределно ясен.
Oптивах се да поясня защо евентуални copy/patse на различните решения не връщат един и същ резултат.
Активен


Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
BASH: Как да поддържам една програма работеща
Общ форум
Regia 1 7234 Последна публикация Feb 16, 2005, 08:51
от
bash
Настройка на програми
tuxi 7 2490 Последна публикация Jun 11, 2005, 19:12
от tuxi
Моля за малко помощ за BASH
Настройка на програми
bonbon 3 1480 Последна публикация Dec 04, 2005, 16:37
от bonbon
BASH
Общ форум
Dean79 3 1670 Последна публикация Jan 13, 2006, 00:24
от Dean79
Bash присвояване на стойност от файл
Общ форум
Pulear 6 2158 Последна публикация May 21, 2006, 17:20
от Pulear