LINUX.ORG.RU
ФорумAdmin

обработка csv файлов bash

 , , ,


0

3

есть файл с таким текстом :

>-oper-29
>*Linux
>/Intel(R) Celeron(R) CPU G1620 @ 2.70GHz
>+ 2.70GHz
>$1,6G 1,2G 385M 136M 67M 390M
>!sda 8:0 0 298,1G 0 disk

и есть csv файл :

Хостнейм ОС Проц Частота Проца Оператива Жесткий  

Нужно вытащить из первого файла данные и поместить в нужный столбец , вытащить не проблема , хоть grep хоть awk а вот записать это для меня вообще дичь , искал в гугле , с помощью awk нет инфы о запись вообще (походу он таким не занимается) что по советуете ? какие есть консольные утилиты для такого ? пытался использовать eсho но оно чудеса выдает ...зарание спасибо!!!=)



Последнее исправление: beastie (всего исправлений: 1)

Ответ на: Хотел бы написал от echo_

Если умеешь мастерски владеть молотком, то любая проблема кажется гвоздём © не моё.

Для этого есть более удобные инструменты.

conformist ★★★
()

Через echo и выводи с разделителями, а потом в готовом файле заменяй конец строки на виндовый.

kostik87 ★★★★★
()

На самом деле всё очень просто, просто нужно уметь (©?). И да, либо перемести топик в Job, предварительно снобдив его более полным описанием проблемы, либо делай всё сам – твоя просьба выходит за рамки обычной помощи с кодом.

kalterfive ★★
()

с помощью awk нет инфы о запись вообще

Инструкцию к bash читать не пробовал?

no-such-file ★★★★★
()

пытался использовать eсho но оно чудеса выдает

Именно echo и нужно использовать.
Какие чудеса? Покажи свой код.
Что используется в качестве разделителя в CSV файле? Для табуляции

echo -e "$HOST\t$OS\t$CPU\t$FREQ\t$RAM\t$HDD" > "file.csv"
P. S. http://www.opennet.ru/docs/RUS/bash_scripting_guide/

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от Kroz

вот тут спасибо

это то что надо , спасибо )

echo_
() автор топика
Ответ на: комментарий от Kroz

Именно echo и нужно использовать.

echo использовать для вывода произвольной строки не нужно, ибо им невозможно вывести произвольную строку. Нужно использовать printf

Что используется в качестве разделителя в CSV файле?

В comma-separated-values-файлах разделителем выступает запятая.

http://www.opennet.ru/docs/RUS/bash_scripting_guide/

Если это рекомендация к прочтению, то это вредная рекомендация.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 2)
Ответ на: комментарий от Zmicier

echo использовать для вывода произвольной строки не нужно, ибо им невозможно вывести произвольную строку. Нужно использовать printf

Месье теоретик?
Когда echo будет недостаточно - тогда и будем решать проблему.

В comma-separated-values-файлах разделителем выступает запятая.

Еще одна красивая теория. Смотрим ТЗ топик-стартера в первом посте, и не придираемся к буквам.

Если это рекомендация к прочтению, то это вредная рекомендация.

Альтернативу, конечно, предложили? Желательно на русском, а то bash-hackers не всем доступен...

Kroz ★★★★★
()
$ cat csvsrc.file
>-oper-29
>*Linux
>/Intel(R) Celeron(R) CPU G1620 @ 2.70GHz
>+ 2.70GHz
>$1,6G 1,2G 385M 136M 67M 390M
>!sda 8:0 0 298,1G 0 disk
$ cat ./csvscript.file
#!/bin/bash
echo "Хостнейм;ОС;Проц;Частота Проца;Оператива;Жесткий" > dest.csv
while read line; do
tmp="$tmp;$(echo $line | cut -c 3-)"
done < csvsrc.file
echo "$tmp" | cut -c 2- >> dest.csv
$ cat dest.csv 
Хостнейм;ОС;Проц;Частота Проца;Оператива;Жесткий
oper-29;Linux;Intel(R) Celeron(R) CPU G1620 @ 2.70GHz; 2.70GHz;1,6G 1,2G 385M 136M 67M 390M;sda 8:0 0 298,1G 0 disk

при желании поля можно более аккуратно отпарсить, убрав лишнюю инфу из ram и hdd.

nerve ★★
()
Ответ на: комментарий от Kroz

Альтернативу, конечно, предложили?

Материалы под редакцией Грега Вулиджа и прилагаемое к ГНУ Башу справочное руководство.

Желательно на русском

Нет, не будет на русском.

echo использовать для вывода произвольной строки не нужно, ибо им невозможно вывести произвольную строку. Нужно использовать printf

Когда echo будет недостаточно - тогда и будем решать проблему.

Это неверно. Проблемы надо не создавать, а не героически их решать их, когда они наконец проявятся.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Материалы под редакцией Грега Вулиджа и прилагаемое к ГНУ Башу справочное руководство.

Ссылки можно?

Это неверно. Проблемы надо не создавать, а не героически их решать их, когда они наконец проявятся.

Не думаю, что начальных классах нужно проходить деление на 0, корень из -1, а на первых занятиях физики - релятивистскую теорию вместо классической механики.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Не думаю, что начальных классах нужно проходить деление на 0, корень из -1, а на первых занятиях физики - релятивистскую теорию вместо классической механики.

Когда я учился в школе и по курсу были квадратные уравнения, нас учили что при дискриминанте равном нулю должно быть один результат, так вот решая уравнение у доски я вывел два одинаковых, препод меня пыталась «поправить» что типа решение одно, на что я «весело и с песней» ей сообщил что вообще-то у любых степенных уравнений кол-во решений будет равно степени, просто в данном случае два результата совпадают, в ответ получил шепотом «ты прав, но вот только вам еще это знать не надо».
Это я к тому что, и в начальной школе может не вредно знать про «деление на 0, корень из -1»?

anc ★★★★★
()
Ответ на: комментарий от anc

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

Инструмент подбирается под задачу.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Касательно твоего кейса - а что тебе дало знание

Очевидно же - знание. А дебилов у нас и так хватает.

anc ★★★★★
()
Ответ на: комментарий от anc

Очевидно же - знание. А дебилов у нас и так хватает.

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

Kroz ★★★★★
()
/^>-/	{ host = substr($0, 2) }
/^>\*/	{ os   = substr($0, 2) }
/^>\//	{ cpu  = substr($0, 2) }
/^>\+/	{ hz   = substr($0, 2) }
/^>\$/	{ ram  = substr($0, 2) }
/^>!/	{ hdd  = substr($0, 2) }
END	{
		OFS = ";"
		print "Хостнейм", "ОС", "Проц", "Частота Проца", "Оператива", "Жесткий"
		print host, os, cpu, hz, ram, hdd
	}
beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от Kroz

Если уж «пошла такая пьянка», то зачем вам знать сколько будет 2+2*2 ? В пещере уютно и без этого знания.

anc ★★★★★
()
Ответ на: комментарий от anc

Если уж «пошла такая пьянка», то зачем вам знать сколько будет 2+2*2 ? В пещере уютно и без этого знания.

В пещере - да. В супермаркете перед кассой - нет.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

В супермаркете перед кассой - нет.

Ну хорошо, ответьте тогда на мой вопрос, сколько это будет?

anc ★★★★★
()
Ответ на: комментарий от Kroz

Материалы под редакцией Грега Вулиджа и прилагаемое к ГНУ Башу справочное руководство.

Ссылки можно?

Материалы под редакцией Грега Вулиджа

http://mywiki.wooledge.org/

Должен предупредить, что к сожалению, они в значительной части несвободны.

прилагаемое к ГНУ Башу справочное руководство

(info "(bash)")
$ info 'bash'
https://www.gnu.org/software/bash/manual/

Не думаю, что начальных классах нужно проходить деление на 0, корень из -1, а на первых занятиях физики - релятивистскую теорию вместо классической механики.

Дурная аналогия, как известно, подобна котенку с дверцей.

Zmicier ★★★★★
()
Ответ на: комментарий от ism

Csv это стандарт, просто записью текста в файл не получится.

Я правильно понял, что коль скоро ваш PHP — это стандарт, то писать на нем просто записью текста в файл не получится, а надо использовать специальные функции, которые умеют PHP?

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

надо использовать специальные функции, которые умеют PHP?

Ту любой язык подойдет, в линуксе достаточно в начале скрипта написать типа #!/bin/php

В баше тексто невозможно удобно обрабатывать

ism ★★★
()
Ответ на: комментарий от ism

любой язык подойдет, в линуксе достаточно в начале скрипта написать типа #!/bin/php

На какой вопрос вы отвечаете?

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Глянул ссылки:
http://mywiki.wooledge.org/ - может и ок, но навигация в wiki - тихий ужас.
https://www.gnu.org/software/bash/manual/ - в первом приближении неплохо, добавил в букмарки.

В сравнении с последней ссылкой, ABS 1) содержит больше примеров 2) рассказывает не только о bash но и некоторых внешних командах 3) есть русская локализация. Так что для новичка ABS все равно лучше.

Дурная аналогия, как известно, подобна котенку с дверцей.

Аналогия самая та. Давай человеку то, что ему нужно для его круга задач, и грузи лишним.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

https://www.gnu.org/software/bash/manual/ - в первом приближении неплохо, добавил в букмарки.

Вам настолько не нравится формат info? Ну тогда мне, вероятно, надо было дать на него еще и четверную ссылку:

— file:///usr/share/doc/bash/bashref.htm

В сравнении с последней ссылкой, ABS 1) содержит больше примеров 2) рассказывает не только о bash но и некоторых внешних командах 3) есть русская локализация. Так что для новичка ABS все равно лучше.

С прилагаемым справочным руководством? Как можно сравнивать справочник и учебник?

Тем не менее, в сравнении с чем угодно книжка Купера содержит кучу малопонятных, не лучших, и откровенно дурных примеров, и вообще крайне небрежно написана. А ее русский перевод изрядно устарел. Для новичка она не просто хуже, а строго противопоказана; ее можно открывать только тогда, когда вы сможете все эти дурные моменты видеть.

Что до «рассказывает о некоторых внешних программах», то есть мнение, что именно такое изложение и порождает ужас, наподобие того, что выше пишет товарищ nerve.

Аналогия самая та.

Ой-ли? Напоминаю, что речь шла о том, что вы предлагаете использовать echo для вывода произвольной строки, чего она делать не умеет.

Давай человеку то, что ему нужно для его круга задач, и грузи лишним.

Вот-де используйте на здоровье, но всегда держите в голове, что строчки "-e", "-en", "-Ee", "-nnn" и так далее она не выведет, и это не будет ошибкой — это, конечно, «не грузи лишним». Смешно.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Zmicier

Вот-де используйте на здоровье, но всегда держите в голове, что строчки "-e", "-en", "-Ee", "-nnn" и так далее она не выведет, и это не будет ошибкой — это, конечно, «не грузи лишним». Смешно.

1. Это касается почти всех консольных команд Линукс. Ты после rm тоже '--' всегда ставишь? А ведь в 1% случаев, когда в каталоге есть файлы начинающийся с '-', rm * тоже может дать весьма неожиданные результаты.

2. Я уже использую Линукс over 15 лет, написал тучу bash скриптов сложности от однострочника до ~500 строк; ни разу не приходилось использовать printf. Ладно я - по Интернету походи - везде пишут про echo, а не printf; (ок - в 9 случаях из 10). А всё потому, что printf проще и выполняет задачу в 99% случаев.

Короче, хватит. Мы с тобой остались при своих, ТС почитал наши мнения и, надеюсь, сделал для себя выводы.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Выполните эти же действия на калькуляторе, получите 8. Это я про знания. А то потом народ «недоумевает» почему это 6 а не 8...

anc ★★★★★
()
Ответ на: комментарий от anc

Это я про знания.

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

P. S. Смотря какой калькулятор.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Возможно вы меня не поняли. Я как раз про практику и говорил. Для этого и привел пример 2+2*2. Кто-то говорит «вот я всю жизнь на калькуляторе считал и получалось 8 и не парьте мне мозг что это 6»

anc ★★★★★
()
Ответ на: комментарий от Kroz

Ну «уели» нечего сказать даже в ответ. Отлично! Сдаюсь!
Но по теме надеюсь мы друг друга поняли.

anc ★★★★★
()
Ответ на: комментарий от Kroz

1. Это касается почти всех консольных команд Линукс.
консольных команд Линукс.

Что это?

Ты после rm тоже '--'

Что значит «тоже»? -- здесь не поможет.

ни разу не приходилось использовать printf

Показательно. А учитывая, что лет с десять printf был еще и единственным нормальным (не считая eval’а) способом записать присвоение переменной по ссылке на нее, — весьма показательно.

ТС почитал наши мнения и, надеюсь, сделал для себя выводы.

Если честно, то что-то заставляет меня в этом сомневаться. :-)

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Показательно. А учитывая, что лет с десять printf был

К своему стыду, но присоединюсь к Kroz, аналогично практически не пользую printf, знаю про него, но забываю регулярно. :) Правда простыней на 500 строк на bash не писал никогда, скорее сказывается большой опыт программирования, нахожу подходящий инструмент.

anc ★★★★★
()
Ответ на: комментарий от nerve

Огромное тебе спасибо

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

echo_
() автор топика
Ответ на: Огромное тебе спасибо от echo_

набыдлокодил снова. хз как тут вставить картинку. http://i.piccy.info/i9/36bb10aebfcb050c58447fef820e9d9e/1471266776/50613/9992...

#!/bin/bash

echo "Хостнейм;ОС;Проц;Частота Проца;Оператива;Жесткий" > dest.csv

while IFS=">" read not host1 os1 cpu2 freq1 ram1 hdd1; do

host=$(echo ${host1:1} | awk '{print $1}')
os=$(echo ${os1:1} | awk '{print $1}')
cpu1=$(echo ${cpu2:1})
cpu=$(echo ${cpu1%@*})
freq=$(echo ${freq1:2})
ram=$(echo ${ram1:1} | awk '{print $2}')
hdd=$(echo $hdd1 | awk '{print $4}')

done < <(xargs < csvsrc.file)

echo "$host;$os;$cpu;$freq;$ram;$hdd" >> dest.csv
по-поводу того что у тебя не получается - покажи что делаешь или чего хочешь добиться.

тебе надо считывать характеристики других компов и добавлять в файл? то есть для каждого компа свой файл с характеристиками или как?

nerve ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.