Антон Мырзин
paperdaemon
.................. .. ................ .......... ........................
Назад Viewing 0 - 20  
wieiner_ [userpic]

нет. все таки не могу расстаться с большой математикой
с элжыэром..не получается уйти..цепи просто чугунные..
а невыгодно-то это все как...

https://www.youtube.com/watch?v=JG8sGXdRJbY

эх я уже не 100%-программист игр.
Мутировал.

Ладно. Хер с ним. Доказоно от нас просто так не уходят.
А Катя еще Америк, обидеться -то как может.

Настроение: ecstatic ecstatic
Музыка: https://www.youtube.com/watch?v=v0uSOjnRm3U
vrotmnen0gi [userpic]
Sojie



+35 )

Толик Панков [userpic]
Записать вывод awk в несколько переменных bash

Или как раскидать результат работы awk по нескольким переменным.

Преамбула


Предположим, у нас есть некоторая таблица в виде файла CSV с набором полей, например таких Login,FullName,Phone,Room,WorkTime и разделителем полей , (запятая):

verb666,Misha Verbitsky,+415314499922,42,11:00-16:00
ktvs421,Vasiliy Kotov,+415314499966,77a,00:00-06:00
dkldn89,Dmitry Kaledin,+415314499949,65b,22:00-00:00
vfurry1,Veniamin Furman,+415314499900,99,12:20-19:25
tpunk56,Tolik Punkoff,+415314499911,59,00:00-11:00


Нужно вытащить из нее некоторые данные, и далее как-либо обработать. Вытащить данные можно с помощью awk, используя оператор print, но возникает вопрос, как передать данные обратно в bash.

Предположим, что заголовок удален, в файле остались только данные.

awk и eval


В bash есть встроенная команда eval, преобразующая переданную ей строку в команду или набор команд оболочки, и запускающая ее на выполнение. Этим и воспользуемся.

1. Организуем цикл, в котором будем производить обработку данных:

IFS_=$IFS
IFS=$'\n'
for TMPSTRING in $(cat "demotable.txt")
do
#тут будет код
done
IFS=$IFS_


Перед циклом я подправил переменную $IFS содержащую глобальные разделители, в нее, в частности, "смотрят" операторы циклов, чтобы определить, где начинается следующий элемент. По умолчанию переменная $IFS содержит пробел, табуляцию и перевод строки, но поскольку у нас есть данные с пробелом, то это не подходит, цикл будет работать неверно. Потому сохраняем старое значение во временную переменную, устанавливаем новое значение в перевод строки (\n). После цикла возвращаем значение на место.
В цикле организуем разбор данных:

echo "$TMPSTRING"|awk -F "," '{print "LOGIN=" $1; print "FULLNAME=" $2
print "PHONE=" $3; print "ROOM=" $4; print "WORKTIME=" $5 }'


Если запустить скрипт сейчас, то он выведет следующее:

LOGIN=verb666
FULLNAME=Misha Verbitsky
PHONE=+415314499922
ROOM=42
WORKTIME=11:00-16:00


Т.е. уже похоже на присваивание значений переменным bash, но есть проблема. Если мы сейчас скормим вывод awk eval'у, то получим ошибку, например такую:

./awk2vars01: line 8: Verbitsky: command not found

А если бы и не получили, то в переменных могла бы оказаться всякая ерунда, строки необходимо экранировать кавычками.

awk print и вывод кавычки


Кавычки для оператора print awk являются служебными символами, в кавычки берутся строковые литералы, т.е. те строки, которые нужно вывести без изменений, как например, "LOGIN=" в коде выше. Экранирование (\") в операторе print тоже приведет к ошибке.

Первый вариант решения - завести внутреннюю переменную awk, содержащую кавычку, и печатать ее в нужном месте:

echo "$TMPSTRING"|awk -F "," '{print "LOGIN=" dq $1 dq; 
    print "FULLNAME=" dq $2 dq; print "PHONE=" dq $3 dq; print"ROOM=" dq $4 dq;
    print "WORKTIME=" dq $5 dq}' dq='"'


Второй вариант, отказаться от awk print и воспользоваться awk printf:

echo "$TMPSTRING"|awk -F "," '{printf "LOGIN=\"%s\"\n" \
	"FULLNAME=\"%s\"\n" \
	"PHONE=\"%s\"\n" \
	"ROOM=\"%s\"\n" \
	"WORKTIME=\"%s\"\n", 
	$1, $2, $3, $4, $5}'


Плюсы: все можно решить в одном операторе, и не нужно вводить дополнительные переменные.
Минусы: получается длинный и неудобный литерал (первый параметр awk printf) с описанием вывода, в котором легко запутаться. А переносить его на следующую строку еще неудобнее - надо брать строку в кавычки, а потом ставить пробел и \

Вывод при обеих вариантах получится аналогичный:

LOGIN="verb666"
FULLNAME="Misha Verbitsky"
PHONE="+415314499922"
ROOM="42"


Теперь можно обернуть все это в eval, чтобы раскидать результат работы awk по переменным.
Для кода с awk print:

eval $(echo "$TMPSTRING"|awk -F "," '{print "LOGIN=" dq $1 dq; 
    print "FULLNAME=" dq $2 dq; print "PHONE=" dq $3 dq; print"ROOM=" dq $4 dq;
    print "WORKTIME=" dq $5 dq}' dq='"')


Для кода с awk printf:

eval $(echo "$TMPSTRING"|awk -F "," '{printf "LOGIN=\"%s\"\n" \
	"FULLNAME=\"%s\"\n" \
	"PHONE=\"%s\"\n" \
	"ROOM=\"%s\"\n" \
	"WORKTIME=\"%s\"\n", 
	$1, $2, $3, $4, $5}')


В демо-скрипте я просто вывожу данные на консоль, в реальном скрипте, что понятно, можно делать обработку данных в переменных bash.

echo "Login: $LOGIN"
echo "Full name: $FULLNAME"
echo "Phone: $PHONE"
echo "Room: $ROOM"
echo "Work time: $WORKTIME"


Вывод (и для одного варианта кода, и для другого):

Login: verb666
Full name: Misha Verbitsky
Phone: +415314499922
Room: 42
Work time: 11:00-16:00

...

Скрипты полностью можно посмотреть на GitHub

Немного об оптимизации )

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/01/21/zapisat-vyvod-awk-v-neskolko-peremennyh-bash/

Tags: , ,
vrotmnen0gi [userpic]
Чёртова дюжина



остальные )рейтинг сайтов

wieiner_ [userpic]

Корчинский про оcкарбитского учителя математики

https://www.youtube.com/watch?v=PrHcTMsNgj0

не надо много говорить порюзке.
По моему офигенній видос, каждое слово патрон бєтєра!

___
also, russian move need nicht zu sprechen

vrotmnen0gi [userpic]
Martina



+43 )

vrotmnen0gi [userpic]
Tina Kay & Rebecca Volpetti & Anastasia Brokelyn



+28 )

Толик Панков [userpic]
Получение строки с определенным номером из файла в Linux

С помощью sed


sed -n 5p /path/to/file

Получить 5 строку из текстового файла с путем /path/to/file

С помощью awk


awk 'NR == 5' /path/to/file

На мой взгляд sed'ом несколько проще, потому что не нужны лишние движения для подстановки переменных shell/bash-скрипта:

TEXTFILE="/etc/group"
STRNO=5

TMPSTRING=`sed -n "$STRNO"p "$TEXTFILE"`


Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/01/19/poluchenie-stroki-s-opredelennym-nomerom-iz-fajla-v-linux/

Tags: ,
vrotmnen0gi [userpic]
Чёртова дюжина



остальные )рейтинг сайтов

К [userpic]

мини-ужастик "Крыса"
Read more... )

vrotmnen0gi [userpic]
Margo Purz



+34 )

vrotmnen0gi [userpic]
Трудо выебудни



+74 )

vrotmnen0gi [userpic]
Чёртова дюжина



остальные )рейтинг сайтов

vrotmnen0gi [userpic]
Alya



+24 )

wieiner_ [userpic]
сумбур, пафос и революция

ГЭЙ, ПРОГРАММЫСТ !

ЗАБЕЙ

    МОЛОТОМ ГЭЙМДЭВА

        НА УСТНУЮ МАТЕМАТИКУ

ВЛИВАЙ

    АЛГЕБРУ ОТРАЖЕНИЙ

        БЛЯСТЯЩУЮ , КЛИФФОРДА

            В ИЗМЫШЛЕНИЯ ЛАВКРАФТА!

Настроение: artistic artistic
Музыка: https://www.youtube.com/watch?v=1kni8EWsmoI
vrotmnen0gi [userpic]
Liv Wild



+27 )

Толик Панков [userpic]
Почти межлокальное

Герман Grep

(из классификатора "Эсхатологические мутанты")

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/01/19/pochti-mezhlokalnoe-6/

Толик Панков [userpic]
Open-AL library for Slackware (библиотека OpenAL для Slackware)

Исходники: openal-soft-1.17.1.tar.bz2
SlackBuild: OpenAL.tar.gz
Он, кстати, почему-то отрабатывает не до конца, библиотеку собирает, а готовый пакет нет.
Готовый пакет: openal-soft-1.17.1.txz

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/01/16/open-al-library-for-slackware-biblioteka-openal-dlya-slackware/

Tags: ,
К [userpic]

Чтобы выжить, необходимо счастье.
Без счастья
Не спастись никому от холода,
Голода, от людей.

Счастье — помощь.

Я был очень счастлив. Лишь потому
Я все еще жив.
Но, глядя в будущее, с ужасом сознаю,
Сколько еще мне понадобится счастья.

Счастье — помощь.

Силён — кто счастлив.
Крепкий борец и умный учитель
Тот, кто счастлив.
 
Счастье — помощь.

Бертольд Брехт 
1939–1947

vrotmnen0gi [userpic]
Чёртова дюжина



остальные )рейтинг сайтов

Назад Viewing 0 - 20