Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: PhrozenCrew в Dec 03, 2009, 12:28



Титла: Bash - взимане на няколко реда от средата на текст файл
Публикувано от: PhrozenCrew в Dec 03, 2009, 12:28
Здравейте,

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

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



Титла: Re: Bash - взимане на няколко реда от средата на текст файл
Публикувано от: gizi_ в Dec 03, 2009, 13:02
На бързо това което се сещам...погледни awk с него можеш да правиш супер много неща:

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

от - текст, до - текст, по този начин може да "режеш" от редове който съдържат определен текст
Код
GeSHi (Bash):
  1. awk '/от/,/до/ { print }' filename
  2.  


Титла: Re: Bash - взимане на няколко реда от средата на текст файл
Публикувано от: PhrozenCrew в Dec 03, 2009, 13:11
На бързо това което се сещам...погледни awk с него можеш да правиш супер много неща:

От/До - ред 3 до ред 10
Код
GeSHi (Bash):
  1. awk 'NR == 3, NR == 10 { print }' filename
  2.  
...
Това е идеално! Благодаря!


Титла: Re: Bash - взимане на няколко реда от средата на текст файл
Публикувано от: radoulov в Dec 04, 2009, 13:00
Цитат
[...]Случайно да се сещате за някоя команда на 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


Титла: Re: Bash - взимане на няколко реда от средата на текст файл
Публикувано от: DNAeon в Dec 04, 2009, 13:48
Здравейте,

Случайно да се сещате за някоя команда на 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.  

Поздрави!


Титла: Re: Bash - взимане на няколко реда от средата на текст файл
Публикувано от: radoulov в Dec 04, 2009, 14:12
Цитат
[...]да извлече да речем 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


Титла: Re: Bash - взимане на няколко реда от средата на текст файл
Публикувано от: DNAeon в Dec 04, 2009, 14:29
Цитат
[...]да извлече да речем 10 реда от файл

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

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

или

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

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


Титла: Re: Bash - взимане на няколко реда от средата на текст файл
Публикувано от: radoulov в Dec 04, 2009, 15:35
Цитат
Да, правилно си разбрал. Това, което съм дал е просто пример, за това как да вземеш отрязъци от файл. Човек винаги може да го пригоди за това кои точно редове му трябват :)

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