Крымский форум (Crimea-Board) Поиск Участники Помощь Текстовая версия Crimea-Board.Net
Здравствуйте Гость .:: Вход :: Регистрация ::. .:: Выслать повторно письмо для активации  
 
> Рекламный блок.
 

Реклама на форуме

 
> Ваша реклама, здесь
 
 
 

  Start new topic Start Poll 

> Задачка на bash, считать текстовый файл построчно
SlavaD | Профиль
Дата 4 Октября, 2008, 13:44
Quote Post



Тех. Админ
Group Icon

Группа: Admin
Сообщений: 503
Регистрация: 13.08.03
Авторитет: 21
Вне форума



Вроде сходу все просто... вот я так и подумал, а оказалось, что результат так и не получил.

Задача, считываем файл построчно и выводим построчно то, что получилось. У кого выйдет wink.gif.
PMEmail Poster
Бобер | Бездомный
Реклама двигатель прогресса       
Quote Post



А кому сча лехко?
Group Icon
















_________________
Желающим разместить рекламу смотреть сюдой
/   
SwD |
Дата 4 Октября, 2008, 14:30
Quote Post



Unregistered









М-м-м... я, наверное, чего-то не понял...

Код
swd@hyena2:~$ cat ./test.txt
первая строка
вторая строка
третья строка
очередная строка
swd@hyena2:~$ cat ./test
#!/bin/bash

strcnt=1
cat ./test.txt | while read lstr
do
 echo $strcnt":"$lstr
 strcnt=$(($strcnt+1))
done

swd@hyena2:~$ ./test
1:первая строка
2:вторая строка
3:третья строка
4:очередная строка
swd@hyena2:~$
3/   
SwD |
Дата 4 Октября, 2008, 14:38
Quote Post



Unregistered









Или вот так...

Код
swd@hyena2:~$ cat ./test.txt
первая строка
вторая строка
третья строка
очередная строка
swd@hyena2:~$ cat ./test2
#!/bin/bash

strcnt=1
while read lstr
do
 echo $strcnt":"$lstr
 strcnt=$(($strcnt+1))
done <./test.txt

swd@hyena2:~$ ./test2
1:первая строка
2:вторая строка
3:третья строка
4:очередная строка
swd@hyena2:~$
3/   
SlavaD | Профиль
Дата 4 Октября, 2008, 16:18
Quote Post



Тех. Админ
Group Icon

Группа: Admin
Сообщений: 503
Регистрация: 13.08.03
Авторитет: 21
Вне форума



SwD

скорми своему скрипту:
в начале пробел, чет его форум съел...
Код
первая  строка


получишь
Код
1:первая строка


а должно
Код
1: первая  строка
PMEmail Poster
1/7191   
SwD |
Дата 4 Октября, 2008, 16:46
Quote Post



Unregistered









SlavaD
Да... есть такая особенность у read...

А если через задницу сделать?
Код
swd@skunk:~$ cat ./test.txt
первая строка
вторая строка
третья строка
очередная строка
swd@skunk:~$ cat ./test
#!/bin/bash
strcnt=1
cat ./test.txt | while read lstr1
do
 echo -e $strcnt":"$lstr1
 lstr2='sed -n ${strcnt}p ./test.txt'
 echo -e $strcnt":"$lstr2
 strcnt=$(($strcnt+1))
done
swd@skunk:~$ ./test
1:первая строка
1: первая строка
2:вторая строка
2:вторая строка
3:третья строка
3:третья строка
4:очередная строка
4:очередная строка
3/   
SlavaD | Профиль
Дата 4 Октября, 2008, 17:35
Quote Post



Тех. Админ
Group Icon

Группа: Admin
Сообщений: 503
Регистрация: 13.08.03
Авторитет: 21
Вне форума



Цитата(SwD @ 4 Октября, 2008, 15:46)
А если через задницу сделать?

smile.gif smile.gif
тогда уж как нить так, но все равно двойные пробелы съедаются
Код
max='cat test.txt | wc -l'
for strcnt in 'seq 1 $max'; do
  lstr2='sed -n ${strcnt}p ./test.txt'
  echo -e $strcnt":"$lstr2
done
PMEmail Poster
1/7191   
SwD |
Дата 4 Октября, 2008, 17:37
Quote Post



Unregistered









Цитата(SlavaD @ 4 Октября, 2008, 17:35)
двойные пробелы съедаются

Двойные пробелы где?
SwD |
Дата 4 Октября, 2008, 17:38
Quote Post



Unregistered









Ага... везде... забавно smile.gif
SwD |
Дата 4 Октября, 2008, 17:41
Quote Post



Unregistered









Причем выделывается именно echo... если руками сделать cat ./test.txt | sed -n 3p двойные пробелы есть...
exn |
Дата 4 Октября, 2008, 17:50
Quote Post



Unregistered









exn@exn-home:/tmp$ perl -e 'for($i=0;<>;$i++){ print $i.":".$_;}' /tmp/test
0: Первая строка
1: Вторая строка
2: Третья строка
3: Строка с табуляцией
4: Строка с кучей пробелов
5:
6:
2/   
SlavaD | Профиль
Дата 4 Октября, 2008, 17:57
Quote Post



Тех. Админ
Group Icon

Группа: Admin
Сообщений: 503
Регистрация: 13.08.03
Авторитет: 21
Вне форума



exn
Ну на перле это просто, а вот на баше сделать wink.gif
PMEmail Poster
1/7191   
SwD |
Дата 4 Октября, 2008, 17:59
Quote Post



Unregistered









Вернее даже не совсем в echo дело... Если вот такой скрипт выполнить, то все пробелы будут на месте...
Код
swd@skunk:~$ cat ./test
#!/bin/bash
strcnt=1
IFS='.'
cat ./test.txt | while read lstr
do
 echo -e $strcnt":"$lstr
 strcnt=$(($strcnt+1))
done
swd@skunk:~$


Но... тогда похерятся двойные «.», ибо именно сей символ у нас будет канать как Input Field Separator, который по умолчанию пробел, табуляция и перевод строки... Короче говоря надо взять в качестве IFS любой символ, которого нету в выводимом файле.
3/   
exn |
Дата 4 Октября, 2008, 18:12
Quote Post



Unregistered









exn@exn-home:/tmp$ cat /tmp/test | awk '{print "Что там надо:" $0}'
Что там надо: Первая строка
Что там надо: Вторая строка
Что там надо: Третья строка
Что там надо: Строка с табуляцией
Что там надо: Строка с кучей пробелов
Что там надо:
Что там надо:
2/   
SwD |
Дата 4 Октября, 2008, 18:27
Quote Post



Unregistered









exn
perl и awk прекрасно с этим справляются... причем в твоем примере вообще достаточно сделать cat /tmp/test и ничего не изменится smile.gif
А вот если bash использовать тут масса нюансов вроде того же IFS smile.gif
3/   
exn |
Дата 4 Октября, 2008, 18:32
Quote Post



Unregistered









Изменится если дополнить например wink.gif

cat /tmp/test | awk '{a+=1;print a $0}'
1 Первая строка
2 Вторая строка
3 Третья строка
4 Строка с табуляцией
5 Строка с кучей пробелов
6
7


read на то и read что не хавает пробелы перед значением.
2/   
exn |
Дата 4 Октября, 2008, 18:34
Quote Post



Unregistered









А вообще для чего это надо ? Я какбе намекаю что есть куча способов решения проблеммы, тогда и sed не используйте если хотите на чистом баше smile.gif
SwD |
Дата 4 Октября, 2008, 18:38
Quote Post



Unregistered









Цитата(exn @ 4 Октября, 2008, 18:34)
Я какбе намекаю что есть куча способов решения проблеммы

Не спорю. Не зная всей задачи сложно дать исчерпывающий ответ smile.gif
Надеюсь, что хинт с IFS SlavaD поможет smile.gif
1/   
SlavaD | Профиль
Дата 4 Октября, 2008, 19:52
Quote Post



Тех. Админ
Group Icon

Группа: Admin
Сообщений: 503
Регистрация: 13.08.03
Авторитет: 21
Вне форума



черт, для for i in 'cat test.txt'; do ... IFS догадался, использовать, а для read даже не подумал

прекрасно работает такой код
Код
IFS=''
while read i; do
  echo "test $i"
done < test.txt


SwD спасибо.

Цитата(exn @ 4 Октября, 2008, 17:34)
А вообще для чего это надо ? Я какбе намекаю что есть куча способов решения проблеммы, тогда и sed не используйте если хотите на чистом баше

Цитата(SwD @ 4 Октября, 2008, 17:38)
Не спорю. Не зная всей задачи сложно дать исчерпывающий ответ

Просто один раз напоролся и заинтересовало, неужели, для такой простой задачи, надо привлекать сторонний язык.
PMEmail Poster
2/7191   

Topic Options Start new topic Start Poll 

 



[ Script Execution time: 0.0156 ]   [ 12 queries used ]   [ GZIP включён ]






Политика конфиденциальности

Top