Скрипты sed & awk

Автор Babay, 14 февраля 2012, 08:55:40

« назад - далее »

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

Babay

Цитата: orlyanuch от 13 февраля 2012, 16:14:04Babay, через гуй заархивируй файл и прикрепи сюда в сообщение, посмотрим, что у него там с названием.

Сделано!

Цитата: orlyanuch от 13 февраля 2012, 16:14:04
И сделай вывод
$echo $IFS

Что-то не получилось у меня никакого вывода... хоть так изощерялся, хоть эдак: 3 варианта ввода попробовал - ничего!
Открыть содержимое (спойлер)
al@debian:~$ echo IFS
IFS
al@debian:~$ echo $IFS

al@debian:~$ $echo $IFS
al@debian:~$
[свернуть]

Цитата: orlyanuch от 13 февраля 2012, 16:14:04
И ещё
$set | head -n 70

А вот тут он - да, понаписал...
Открыть содержимое (спойлер)
al@debian:~$ set | head -n 70
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION=/etc/bash_completion
BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
BASH_COMPLETION_DIR=/etc/bash_completion.d
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="5" [3]="1" [4]="release" [5]="i486-pc-linux-gnu")
BASH_VERSION='4.1.5(1)-release'
COLORTERM=gnome-terminal
COLUMNS=80
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-nqhmpbJrSi,guid=e0f7138bcea0a939f9fa4b080000040f
DESKTOP_SESSION=gnome
DIRSTACK=()
DISPLAY=:1.0
EUID=1000
GDMSESSION=gnome
GDM_KEYBOARD_LAYOUT=us
GDM_LANG=ru_RU.utf8
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GNOME_KEYRING_CONTROL=/tmp/keyring-jTVjNO
GNOME_KEYRING_PID=3371
GROUPS=()
GTK_MODULES=canberra-gtk-module
GTK_RC_FILES=/etc/gtk/gtkrc:/home/al/.gtkrc-1.2-gnome2
HISTCONTROL=ignoreboth
HISTFILE=/home/al/.bash_history
HISTFILESIZE=500
HISTSIZE=500
HOME=/home/al
HOSTNAME=debian
HOSTTYPE=i486
IFS=$' \t\n'
LANG=ru_RU.utf8
LINES=24
LOGNAME=al
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:'
MACHTYPE=i486-pc-linux-gnu
MAILCHECK=60
OPTERR=1
OPTIND=1
ORBIT_SOCKETDIR=/tmp/orbit-al
OSTYPE=linux-gnu
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
PIPESTATUS=([0]="0")
PPID=3655
PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
PS2='> '
PS4='+ '
PWD=/home/al
SESSION_MANAGER=local/debian:@/tmp/.ICE-unix/3389,unix/debian:/tmp/.ICE-unix/3389
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_AGENT_PID=3426
SSH_AUTH_SOCK=/tmp/keyring-jTVjNO/ssh
TERM=xterm
UID=1000
USER=al
USERNAME=al
WINDOWID=46137347
WINDOWPATH=8
XAUTHORITY=/var/run/gdm3/auth-for-al-iYEHgC/database
XDG_DATA_DIRS=/usr/share/gnome:/usr/share/gdm/:/usr/local/share/:/usr/share/
XDG_SESSION_COOKIE=15c07b7cbd7be79890690d8e0000000b-1329193466.664841-2085185235
_=/etc/bash_completion
bash: set: ошибка записи: Обрыв канала
al@debian:~$

[свернуть]

Цитата: qupl от 13 февраля 2012, 18:52:00У себя прекрасно создал и удалил файл с пробелом вначале так:

Что тут сказать - завидую я ...!!!   :)
А Вы попробуйте вот так: получиться-нет?
Вот Вам файл grade.txt
Открыть содержимое (спойлер)
M.Tansley   05/99   48311   Green   8   40   44
J.Lulu      06/99   48317   green   9   24   26
P.Bunny      02/99   48   Yellow   12   35   28
J.Troll      07/99   4842   Brown-3   12   26   26
L.Tansley   05/99   4712   Brown-2   12   30   28
[свернуть]

А вот то, что надо сделать, скрипт.
Открыть содержимое (спойлер)
awk 'BEGIN {print "Name      Belt\n---------------------"} \{print $1 " \t" $4}' grade.txt
[свернуть]
(Выполниться у Вас или нет?)

У меня - нет!  Пишет
Цитироватьawk: 1: unexpected character '\'

Ин дер гроссе фамилиен нихт клювен клац-клац...

orlyanuch

#1
awk 'BEGIN {print "Name      Belt\n---------------------"} \{print $1 " \t" $4}' grade.txt
                                                                                     ^^
Если скрипт пишешь в одну строку, то вот этот обратный сплэш лишний

Файл распаковался без всяких пробелов в названии и работает по команде
./student_tot.awk grade.txt

Единственно, пришлось сменить в нём
Цитировать#!/bin/awk -f

на

Цитировать#!/usr/bin/awk -f

иначе выдавал

orlik@17:36:52|:~/test$ ./student_tot.awk
bash: ./student_tot.awk: /bin/awk: плохой интерпретатор: Нет такого файла или каталога


Можно посмотреть твой вывод

which awk
Edimus, ut vivamus; nоn vivimus, ut edamus.

Babay

#2
Цитата: orlyanuch от 14 февраля 2012, 13:20:08Если скрипт пишешь в одну строку, то вот этот обратный сплэш лишний

И ведь действительно - лишний!!!  :o
(Я убью этого переводчика... и издателя!) >:(
.


Сообщение объединено: 14 февраля 2012, 14:01:15

Цитата: orlyanuch от 14 февраля 2012, 13:20:08Файл распаковался без всяких пробелов в названии и работает по команде
Код: [Выделить]

./student_tot.awk grade.txt

Единственно, пришлось сменить в нём
Цитировать (выделенное)

    #!/bin/awk -f

на

Цитировать (выделенное)

    #!/usr/bin/awk -f

иначе выдавал

Код: [Выделить]

orlik@17:36:52|:~/test$ ./student_tot.awk
bash: ./student_tot.awk: /bin/awk: плохой интерпретатор: Нет такого файла или каталога

Вот-вот...

(А что это значит? И что, в связи с этим, делать?)

Цитата: orlyanuch от 14 февраля 2012, 13:20:08Можно посмотреть твой вывод

Код: [Выделить]

which awk

Вот
Открыть содержимое (спойлер)

al@debian:~$ which awk
/usr/bin/awk
al@debian:~$
[свернуть]

Старайтесь делать меньше пустых строк в сообщениях. Пожалейте место на экране у других.Malaheenee
Ин дер гроссе фамилиен нихт клювен клац-клац...

orlyanuch

#3
Блин, и я сразу внимательно не посмотрел  ::)
which показывает истинное расположение awk
Нужно сменить в скрипте
Цитировать#! /bin/awk -f

на

Цитировать#!/usr/bin/awk -f

Про #!/bin/awk в книге написано на 105 странице. Просто у нас awk находится не в /bin, а в /usr/bin

Сообщение объединено: 14 февраля 2012, 14:19:20


Ещё одна инфа:

Открыть содержимое (спойлер)
Если файл сценария начинается с последовательности #!, которая в мире UNIX называется sha-bang, то это указывает системе какой интерпретатор следует использовать для исполнения сценария. Это двухбайтовая последовательность, или [4] -- специальный маркер, определяющий тип сценария, в данном случае -- сценарий командной оболочки (см. man magic). Более точно, sha-bang определяет интерпретатор, который вызывается для исполнения сценария, это может быть командная оболочка (shell), иной интерпретатор или утилита. [5]

#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/usr/awk -f



Каждая, из приведенных выше сигнатур, приводит к вызову различных интерпретаторов, будь то /bin/sh -- командный интерпретатор по-умолчанию (bash для Linux-систем), либо иной. [6] При переносе сценариев с сигнатурой #!/bin/sh на другие UNIX системы, где в качестве командного интерпретатора задан другой shell, вы можете лишиться некоторых особенностей, присущих bash. Поэтому такие сценарии должны быть POSIX совместимыми. [7].

Обратите внимание на то, что сигнатура должна указывать правильный путь к интерпретатору, в противном случае вы получите сообщение об ошибке -- как правило это "Command not found".

Сигнатура #! может быть опущена, если вы не используете специфичных команд. Во втором примере (см. выше) использование сигнатуры #! обязательно, поскольку сценарий использует специфичную конструкцию присваивания значения переменной lines=50. Еще раз замечу, что сигнатура #!/bin/sh вызывает командный интерпретатор по-умолчанию -- /bin/bash в Linux-системах.
[свернуть]

Источник

С переменной IFS и выводом set всё нормально.
Про IFS можно здесь почитать.
Edimus, ut vivamus; nоn vivimus, ut edamus.

Babay

orlyanuch, Спасибо!
Вроде бы, "пошло дело"...

(Я даже не знаю, что бы без Вас делал!  :-\ )
Ин дер гроссе фамилиен нихт клювен клац-клац...

Babay

#5
orlyanuch, SOS!

Опять не получается!
Команда sort. (стр. 132 ,  П. 11.1.8 "Сортировка по заданному полю"!).
Открыть содержимое (спойлер)
На всякий случай опишу:
Есть текстовой файл video.txt, в нем информация из базы данных фирмы занимающаяся прокатом видеокассет.
Инф. представляет собой перечень кассет, предлагавшиеся фирмой в 4 квартале.
Поля файла:
1 = Название фильма
2 = код фирмы-дистр.
3 = кол-во заказов за квартал
4 = кол-во заказов за год
[свернуть]

"Трудность": когда надо отсортировать по 2-му ключу (по 2-му полю) - коду фирм-дистр.) по команде   sort  -t: +1 video.txt  выодит номер ключа (+1) и пишет "нет такого файла".
Да вот сами взгляните
Открыть содержимое (спойлер)
al@debian:~$ cd u
al@debian:~/u$ ls
append.sed     data.f             grade.txt   ok.txt      student_tot.awk
arraytest.awk  dos.sed            guote.txt   passwd.awk  video.txt
belts.awk      dos.txt            insert.sed  sedex.txt
change.sed     grade_student.txt  myfile      sed.out
al@debian:~/u$ sort -t: +1 video.txt
sort: операция открытия завершилась неудачно: +1: Нет такого файла или каталога
al@debian:~/u$

[свернуть]

Что не так?
(Я по разному пробовал указывать этот ключ - и 1-м пробелом, и  с 2-мя пробелами, и с 3-мя, и вообще без пробелов = фигушки!)
Может у Линукса здесь тоже что-то по-другому, чем у Юникса?
Ин дер гроссе фамилиен нихт клювен клац-клац...

orlyanuch

#6
В нашей версии команды sort ключи типа +1, +2 и т.д. уже не применяются. Набери
sort  --help

Я тоже на этом буксовал.
Сейчас правильно так:
sort -t: -k2 video.txt

Обрати внимание, не -k1, а -k2, порядок отсчёта полей отличается: не с нуля, как у прежнего цифрового ключа, а с единицы.
И количество пробелов между командой (sort), её опциями (-t, -k) и аргументом (video.txt) не имеет значения. При разборе строки оболочка их везде сократит до одного. Пробелы имеют значение для некоторых опций (не для всех). Для опций лучше писать так, как приведено в man. В данном случае -t: или как ниже написали -t ':' , -k2.
Edimus, ut vivamus; nоn vivimus, ut edamus.

ihammers

Цитата: Babay от 01 марта 2012, 12:02:36
...
sort -t: +1 video.txt
...

Параметр t определяет что является "разделителем", а -k2.1 определяет столбец и с какой строки начинать сортировать.
sort -t '=' -k2.1 test.sort

PS: в вашем случае разделителем является ":", а +1 команда считает именем файла.
Debian GNU/Linux Bookworm, LXQt/OpenBox: AMD Ryzen 5 5600G / 64Gb RAM
_______________________________
Debian GNU/Linux Bookworm, без графики: AMD Phenon X4 / 16Gb RAM
_______________________________
Debian GNU/Linux Bookworm, LXQt/OpenBox: Acer Aspire One 722 AMD C60 / 8Gb RAM / ATI HD6290

Babay

orlyanuch, ihammers Спасибо! "Въехал"!  :D

ЦитироватьВ нашей версии команды sort ключи типа +1, +2 и т.д. уже не применяются

orlyanuch, я так понимаю, дальше по книге меня ждут еще сюрпризы, вроде этого? Да?
Ин дер гроссе фамилиен нихт клювен клац-клац...

orlyanuch

Ты сразу набирай
имя_команды --help
Практически все хэлпы уже на русском.
Открыть содержимое (спойлер)
Мне кажется, если тему продолжать, то её следует переименовать, что-то вроде "проблемы со сценариями", или типа того
[свернуть]
Edimus, ut vivamus; nоn vivimus, ut edamus.

Babay

#10
Цитата: orlyanuch от 02 марта 2012, 02:27:52Ты сразу набирай
имя_команды --help
Практически все хэлпы уже на русском.

Ок! (А я до сих пор с манами на буржуйском мучился, пытался там что-то понять! :D ). А с хелпами получше!   :) Спасибо!

Цитата: orlyanuch от 02 марта 2012, 02:27:52Мне кажется, если тему продолжать, то её следует переименовать, что-то вроде "проблемы со сценариями", или типа того

А лучше, думаю, все это  сразу выделить в подраздел "Shell". (Не как тему, а именно как подраздел!)
Думается это будет один из самых важных разделов форума (почище "Железо", "Установка" и прочее-прочее)
Ведь на -иксах, куда ни кинься, без него никуда.  А мощь какую дает!!!
ИМХО!





Сообщение объединено: 02 марта 2012, 09:25:26

ihammers , orlyanuch, хотел вас спросить: а как вы указываете в качестве разделителя "пробел" и "Таб"?
(Я  хочу попробовать таким же "макаром" и вордовские текстовые документы "попрепарировать" (doc и docx)! )
А еще хотел спросить: как вы из вордовских таблиц данные "выдергиваете"?
(Для чего? А вот, к примеру, вам из множества отделов какой-нибудь шарашки, дали "кучу" же вордовских документов и сказали - "Сведи все данные в одну объединенную таблицу всей нашей шарашки!". А все данные разнесены не по тематическим, а по сводным таблицам.
Можно сидеть и тупо чуть ли не целую неделю перепечатывать (вырезать/копировать и т.д.)...   Но вы же, конечно же, сделаете по-другому... ;) Как? )

Или киньте ссылку где почитать!
Ин дер гроссе фамилиен нихт клювен клац-клац...

orlyanuch

#11
В bash разделитель задаётся с помощью переменной IFS, я тебе выше ссылку давал почитать, глянь.
Ещё вот можно почитать.
И ещё есть хороший перевод man bash, хоть и очень утаревший. Там найди про IFS.
Ну это в bash. А в других командах задаётся по другому. В команде sort, к примеру, с помощью опции -t, у awk -F.

Про вордовские документы ничего не могу сказать, про таблицы тоже. Может, кто знает, напишет.
А с обыкновенным преобразованием текста (Unix <> Dos) хорошо справляется sed.
Вот здесь хорошая коллекция скриптов sed. Было очень полезно и познавательно рабирать эти скрипты.
Edimus, ut vivamus; nоn vivimus, ut edamus.

Babay

#12
Цитата: orlyanuch от 02 марта 2012, 10:10:06Про вордовские документы ничего не могу сказать, про таблицы тоже. Может, кто знает, напишет.
Цитата: Malaheenee от 02 марта 2012, 10:57:42Тема выливается в обсуждение программирование вместе с обучением оному. Переименуйте тему тогда, что-ли. Или лучше разделить на две отдельные (чтобы для истории сохранилось)?

Ок!
Сейчас  еще ответа ihammers насчет "выдирания" данных из таблиц дождусь, а потом, все другие свои вопросы (дай Бог, чтобы их вообще не было!), буду задавать в других соответствующих темах!


Цитата: orlyanuch от 02 марта 2012, 10:10:06Вот здесь хорошая коллекция скриптов sed. Было очень полезно и познавательно рабирать эти скрипты.

За скрипты Большое Спасибо! (Вот уж действительно - "не было бы счастья, да несчастье помогло!" :D).

(Пока ihammers не пришел!  :D) Я так думаю, чтобы с таблицами и прочими вордовскими "радостями" научиться работать, надо будет в Perl углубляться? sed-ом и  awk здесь не обойтись!  Верно?
Ин дер гроссе фамилиен нихт клювен клац-клац...

ihammers

#13
Цитата: Babay от 02 марта 2012, 11:34:07
Мне как-то не требовалось в научных расчётах работать со сведением таблиц. 
Хотя если таблица нормально сохраниться в txt, то можно попытаться свести sed, awk, а в некоторых случаях достаточно будет echo text1.txt >> text2.txt

Цитата: Malaheenee от 02 марта 2012, 10:57:42
Тема выливается в обсуждение программирование вместе с обучением оному. Переименуйте тему тогда, что-ли. Или лучше разделить на две отдельные (чтобы для истории сохранилось)?
Думаю что стоит разделить на две темы (скрипты sed & awk и др.), а эту тему оставить для истории.

Не увлекайтесь оверквотингом. Malaheenee
Debian GNU/Linux Bookworm, LXQt/OpenBox: AMD Ryzen 5 5600G / 64Gb RAM
_______________________________
Debian GNU/Linux Bookworm, без графики: AMD Phenon X4 / 16Gb RAM
_______________________________
Debian GNU/Linux Bookworm, LXQt/OpenBox: Acer Aspire One 722 AMD C60 / 8Gb RAM / ATI HD6290

Babay

Цитата: ihammers от 02 марта 2012, 11:47:38Хотя если таблица нормально сохраниться в txt, то можно попытаться свести sed, awk, а в некоторых случаях достаточно будет echo text1.txt >> text2.txt

Нет! Вот именно, чтобы формат документа был бы не txt,  а doc или docx!

P.S.

Я понял/вспомнил!!! (Как же я  мог это забыть!)
На курсах Специалиста (не помню в каком!) препод показывал (архивировал, потом что-то там делал... не помню что именно и показывал...) , что вордовские файлы, на самом деле, состоят из 2-х - по-моему - сам текст (txt) и оформление (XML).
Вот "отсюда плясать надо"! :)


Ин дер гроссе фамилиен нихт клювен клац-клац...