Задачка на bash | Крымский форум

Задачка на bash

  • Добро пожаловать на форум! Рады видеть вас здесь! Зарегистрируйтесь или Войдите в аккаунт, чтобы иметь полный доступ к площадке!

SlavaD

Тех. Админ
Команда форума
Координатор
Легенда
Сообщения
505
Реакции
14
Репутация
21
Вроде сходу все просто... вот я так и подумал, а оказалось, что результат так и не получил.

Задача, считываем файл построчно и выводим построчно то, что получилось. У кого выйдет
wink.gif
.
 
М-м-м... я, наверное, чего-то не понял...

Код
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@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:~$
 
SwD

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


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


а должно
Код
1: первая  строка
 
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:очередная строка
 
Цитата(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
 
Цитата(SlavaD @ 4 Октября, 2008, 17:35)
двойные пробелы съедаются

Двойные пробелы где?
 
Причем выделывается именно echo... если руками сделать cat ./test.txt | sed -n 3p двойные пробелы есть...
 
exn@exn-home:/tmp$ perl -e 'for($i=0;<>;$i++){ print $i.":".$_;}' /tmp/test
0: Первая строка
1: Вторая строка
2: Третья строка
3: Строка с табуляцией
4: Строка с кучей пробелов
5:
6:
 
exn
Ну на перле это просто, а вот на баше сделать
wink.gif
 
Вернее даже не совсем в 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@exn-home:/tmp$ cat /tmp/test | awk '{print "Что там надо:" $0}'
Что там надо: Первая строка
Что там надо: Вторая строка
Что там надо: Третья строка
Что там надо: Строка с табуляцией
Что там надо: Строка с кучей пробелов
Что там надо:
Что там надо:
 
exn
perl и awk прекрасно с этим справляются... причем в твоем примере вообще достаточно сделать cat /tmp/test и ничего не изменится
smile.gif

А вот если bash использовать тут масса нюансов вроде того же IFS
smile.gif
 
Изменится если дополнить например
wink.gif


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


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

Не спорю. Не зная всей задачи сложно дать исчерпывающий ответ
smile.gif

Надеюсь, что хинт с IFS SlavaD поможет
smile.gif
 
черт, для 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)
Не спорю. Не зная всей задачи сложно дать исчерпывающий ответ

Просто один раз напоролся и заинтересовало, неужели, для такой простой задачи, надо привлекать сторонний язык.
 
Назад
Сверху