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

Програмиране => Общ форум => Темата е започната от: LinuxFanUNIX в May 10, 2009, 23:20



Титла: Помощ за bash script
Публикувано от: LinuxFanUNIX в May 10, 2009, 23:20
Здравейте приятели. Имам следния проблем.  Имам текстов файл състоящ се от хиляди редове. Опитвам се да създам bash скрипт, който прочита редовете от този голям файл, като стигне до празен ред, да прекъсва четенето и да създаде файл с име като първия ред на текущия абзац...

Ако някой знае как да стане на друг език, няма проблеми, просто ми е нужно нещо автоматизирано, така че не е проблем на какъв език ще е.

Ето и един пример:

Голям_Файл.txt:
Код:
Name: Ivan Ivanov
EGN: 12345678910
Phone number: 0888123456
City: Sofia
Street: Ala-Bala 1

Name: Petyr Ivanov
EGN: 12345678910
Phone number: 0888123456
City: Plovdiv
Street: Ala-Bala 2

И скрипта да направи това:
Започва да чете Голям_Файл.txt, и като срещне празния ред, да създаде файл с име като първия ред на текущия абзац или в случая -  Ivan Ivanov. След това да продължи да чете файла и като срещне празен ред, отново да създаде файл с име като първия ред на текущия абзац - този път с име Petyr Ivanov.

Ето и примерите:
Голям_Файл.txt:
Код:
Name: Ivan Ivanov
EGN: 12345678910
Phone number: 0888123456
City: Sofia
Street: Ala-Bala 1

Name: Petyr Ivanov
EGN: 12345678910
Phone number: 0888123456
City: Plovdiv
Street: Ala-Bala 2

И резултата:

Ivan Ivanov.txt
Код:
Name: Ivan Ivanov
EGN: 12345678910
Phone number: 0888123456
City: Sofia
Street: Ala-Bala 1

Petyr Ivanov.txt
Код:
Name: Petyr Ivanov
EGN: 12345678910
Phone number: 0888123456
City: Plovdiv
Street: Ala-Bala 2

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


Титла: Re: Помощ за bash script
Публикувано от: shadowx в May 10, 2009, 23:32
#!/bin/bash

file=$1
name=""

while read line ; do
       y =`echo $line | awk '{print $1}'`

       if $y == "Name:" ; then
              name=`echo $line | awk '{print $2,3}' | tr " " "_"`
              name="$name.txt"
              echo $line > $name
       else
              echo $line >> $name
       fi
done < $file


Титла: Re: Помощ за bash script
Публикувано от: LinuxFanUNIX в May 11, 2009, 00:04
#!/bin/bash

file=$1
name=""

while read line ; do
       y =`echo $line | awk '{print $1}'`

       if $y == "Name:" ; then
              name=`echo $line | awk '{print $2,3}' | tr " " "_"`
              name="$name.txt"
              echo $line > $name
       else
              echo $line >> $name
       fi
done < $file
Просто не мога да разбера, как толкова бързо ми отговори... Супер си. Благодаря ти много! Жив и здрав да си!
Браво!


Титла: Re: Помощ за bash script
Публикувано от: radoulov в May 12, 2009, 11:06
С awk:

Код:
awk -F': |\n' '{print>$2".txt"}' RS= big_file

За да избегнеш грешката too many open files при някои стари awk версии:

Код:
awk -F': |\n' '{
  f && close(f)
  print > (f = $2 ".txt")
  }' RS= big_file


Титла: Re: Помощ за bash script
Публикувано от: LinuxFanUNIX в May 15, 2009, 23:05
С awk:

Код:
awk -F': |\n' '{print>$2".txt"}' RS= big_file

За да избегнеш грешката too many open files при някои стари awk версии:

Код:
awk -F': |\n' '{
  f && close(f)
  print > (f = $2 ".txt")
  }' RS= big_file
Мерси. И това ще се пробва. Да си жив и здрав!  ;)