Рекламный блок.
Ваша реклама, здесь
Загрузка. Пожалуйста, подождите...
Задачка на bash , считать текстовый файл построчно
SlavaD | Профиль
Дата 4 Октября, 2008, 13:44
Тех. Админ
Группа: Admin
Сообщений: 503
Регистрация: 13.08.03
Авторитет: 21
Вне форума
Вроде сходу все просто... вот я так и подумал, а оказалось, что результат так и не получил.
Задача, считываем файл построчно и выводим построчно то, что получилось. У кого выйдет
.
Бобер | Бездомный
Реклама двигатель прогресса
А кому сча лехко?
_________________ Желающим разместить рекламу смотреть сюдой
SwD |
Дата 4 Октября, 2008, 14:30
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:~$
SwD |
Дата 4 Октября, 2008, 14:38
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:~$
SlavaD | Профиль
Дата 4 Октября, 2008, 16:18
Тех. Админ
Группа: Admin
Сообщений: 503
Регистрация: 13.08.03
Авторитет: 21
Вне форума
SwD скорми своему скрипту:
в начале пробел, чет его форум съел...
Код
первая строка
получишь
Код
1:первая строка
а должно
Код
1: первая строка
SwD |
Дата 4 Октября, 2008, 16:46
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:очередная строка
SlavaD | Профиль
Дата 4 Октября, 2008, 17:35
Тех. Админ
Группа: Admin
Сообщений: 503
Регистрация: 13.08.03
Авторитет: 21
Вне форума
Цитата(SwD @ 4 Октября, 2008, 15:46)
А если через задницу сделать?
тогда уж как нить так, но все равно двойные пробелы съедаются
Код
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
SwD |
Дата 4 Октября, 2008, 17:37
Unregistered
Цитата(SlavaD @ 4 Октября, 2008, 17:35)
двойные пробелы съедаются
Двойные пробелы где?
SwD |
Дата 4 Октября, 2008, 17:38
Unregistered
Ага... везде... забавно
SwD |
Дата 4 Октября, 2008, 17:41
Unregistered
Причем выделывается именно echo... если руками сделать cat ./test.txt | sed -n 3p двойные пробелы есть...
exn |
Дата 4 Октября, 2008, 17:50
Unregistered
exn @exn -home:/tmp$ perl -e 'for($i=0;<>;$i++){ print $i.":".$_;}' /tmp/test 0: Первая строка 1: Вторая строка 2: Третья строка 3: Строка с табуляцией 4: Строка с кучей пробелов 5: 6:
SwD |
Дата 4 Октября, 2008, 17:59
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 любой символ, которого нету в выводимом файле.
exn |
Дата 4 Октября, 2008, 18:12
Unregistered
exn @exn -home:/tmp$ cat /tmp/test | awk '{print "Что там надо:" $0}' Что там надо: Первая строка Что там надо: Вторая строка Что там надо: Третья строка Что там надо: Строка с табуляцией Что там надо: Строка с кучей пробелов Что там надо: Что там надо:
SwD |
Дата 4 Октября, 2008, 18:27
Unregistered
exn perl и awk прекрасно с этим справляются... причем в твоем примере вообще достаточно сделать cat /tmp/test и ничего не изменится
А вот если
bash использовать тут масса нюансов вроде того же IFS
exn |
Дата 4 Октября, 2008, 18:32
Unregistered
Изменится если дополнить например
cat /tmp/test | awk '{a+=1;print a $0}'
1 Первая
строка 2 Вторая
строка 3 Третья
строка 4 Строка с
табуляцией 5 Строка с кучей пробелов
6
7
read на то и
read что не хавает пробелы перед значением.
exn |
Дата 4 Октября, 2008, 18:34
Unregistered
А вообще для чего это надо ? Я какбе намекаю что есть куча способов решения проблеммы, тогда и sed не используйте если хотите на чистом баше
SwD |
Дата 4 Октября, 2008, 18:38
Unregistered
Цитата(exn @ 4 Октября, 2008, 18:34)
Я какбе намекаю что есть куча способов решения проблеммы
Не спорю. Не зная всей задачи сложно дать исчерпывающий ответ
Надеюсь, что хинт с IFS
SlavaD поможет
SlavaD | Профиль
Дата 4 Октября, 2008, 19:52
Тех. Админ
Группа: 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)
Не спорю. Не зная всей задачи сложно дать исчерпывающий ответ
Просто один раз напоролся и заинтересовало, неужели, для такой простой задачи, надо привлекать сторонний язык.
Сообщение отправляется. Пожалуйста, подождите...
После проверки сообщения модератором, оно будет добавлено в эту тему
[ Script Execution time: 0.0156 ] [ 12 queries used ] [ GZIP включён ]
Политика конфиденциальности