Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Написать простой Sheel работа со строками.  (Прочитано 962 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Comokus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Надо найти в существующих файлах записи, у которых 33 поле равно G и вывести найденные записи в отдельный файл
Я не волшебник, я только учусь. ))

Оффлайн БТР

  • Заслуженный пользователь
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6283
    • Просмотр профиля
щас же вроде каникулы?

Оффлайн Comokus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Мне по работе надо  :-[
Я не волшебник, я только учусь. ))

Оффлайн Vitsliputsli

  • Старожил
  • *
  • Сообщений: 1293
    • Просмотр профиля
А что такое 33 поле?

Если разделители полей пробелы, то:
sed -n 'h;s/\([^ ]*[ ]\)\{32\}G .*//;tG;bE;:G;g;p;:E' input.file > output.fileХоть бы пример файла кинули, может и проще получилось бы.

Оффлайн Comokus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Разделитель "|"
Файлик прикрепил.

Пользователь решил продолжить мысль 04 Июля 2013, 17:24:07:
А что такое 33 поле?


33'е поле , это поле в котором может находиться любая буква, но нам нужно найти строки именно с буквой "G"
« Последнее редактирование: 04 Июля 2013, 17:24:07 от Comokus »
Я не волшебник, я только учусь. ))

Оффлайн Vitsliputsli

  • Старожил
  • *
  • Сообщений: 1293
    • Просмотр профиля
Тогда так:
sed -n 'h;s/\([^|]*[|]\)\{32\}G|.*//;tZ;bE;:Z;g;p;:E' XXXXXXXXXX.txt > output.file

Оффлайн Comokus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Тогда так:
sed -n 'h;s/\([^|]*[|]\)\{32\}G|.*//;tZ;bE;:Z;g;p;:E' XXXXXXXXXX.txt > output.file
В ответ пищит следующее:
sed: Label too long: h;s/\([^|]*[|]\)\{32\}G|.*//;tZ;bE;:Z;g;p;:E

output.file - создаёт но не заполняет.
Я не волшебник, я только учусь. ))

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Надо найти в существующих файлах записи, у которых 33 поле равно G и вывести найденные записи в отдельный файл
Разделитель "|"
Код: (bash) [Выделить]
awk -F'|' '$33=="G"{print $0}' file*.in >file.out

$ awk --version
GNU Awk 4.0.1

Оффлайн Comokus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Надо найти в существующих файлах записи, у которых 33 поле равно G и вывести найденные записи в отдельный файл
Разделитель "|"
Код: (bash) [Выделить]
awk -F'|' '$33=="G"{print $0}' file*.in >file.out

$ awk --version
GNU Awk 4.0.1


Огромное Спасибо!!!! Заработало! )))
Я не волшебник, я только учусь. ))

Оффлайн Vitsliputsli

  • Старожил
  • *
  • Сообщений: 1293
    • Просмотр профиля
Странно, скорее всего что-то не так скопировали. У меня (GNU sed версия 4.2.1) работает без проблем.
В любом случае с awk красивее.

Кто-нибудь знает, а можно ли в sed пользоваться разделителями как в awk? Не могу найти ничего подобного, а без них тяжко.

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Код: (bash) [Выделить]
grep -P '^([^|]*\|){32}G\|' file*.in >file.out

$ grep --version
grep (GNU grep) 2.14
%)

Оффлайн Comokus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Вот что у меня получилось:
find . -name '*.gz' -exec gzcat {} \; | awk -F'|' '$33=="G"{print $0}' > file.out
Я не волшебник, я только учусь. ))

 

Страница сгенерирована за 0.029 секунд. Запросов: 25.