LINUX.ORG.RU

есть ли среди консольных ютилит ...?


0

0

нечто вроде транспонирования таблицы данных.

проблема вот в чем: есть N файлов с текстом вида

поле1:значение1
...
полеI:значениеI
строка текста
полеJ:значениеJ
...
полеK:значениеK

I,J,K и названия полей везде одинаковы и известны.

надо составить таблицу:

файл  поле1     ... полеI              полеJ     ... полеK
1     значение1 ... значениеI  строка  значениеJ ... значениеK
2     значение1 ... значениеI  строка  значениеJ ... значениеK
...
варианты исполнения: 1) цикл с join-ом + транспонирование; 2) транспонирование + cat (хочу этот, т.к. проще)

собственно вопрос: если ли среди __стандартных__утилит__ что-то, что может помочь с транспонированием? «однострочники» на скрипто-языках также приветствуются.

ЗЫ: в первом варианте можно было бы замутить через Calc, но лень копать join.

★★

пока вместо join-ов намутил следующий изврат:

ls | while read n; do (echo "$n"; awk '{if(NR==19){print ":" $0}else{print $0}}' $n | cut -d ":" -f 2- )>$n.data; done


(echo "<file>"; awk -F ":" '{if(NR==19){print "<text>"}else{print $1}}' `ls | head -1` )>header


paste header *.data >table
теперь это дело вроде как можно транспонировать в Calc-е.

вопрос, однако, остается открытым, ибо Calc нежелателен.

xydo ★★
() автор топика

совсем забыл: значения полей - строки. в т.ч. содержащие двоеточия

xydo ★★
() автор топика

Может лучше открыть N файлов, считать у всех 1ю строку, и записывать сразу в транспонированном виде?

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

считать у всех 1ю строку

наверное, ты имел в виду _все_ строки? (если ты не заметил, исходные файлы фактически представляют собой 2 колонки «поле:значение») и опять-таки это будет эквивалентно написанию собственной проги. а я не хочу тратить время на что-то большее, чем 40-ка символьный скрипт awk/sed

о, кстати, идея, awk-шный print способен не ставить в конце вывода перенос строки? если так, то проблема решается вообще элементарно.

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

> awk-шный print способен не ставить в конце вывода перенос строки?

print expr-list -- Prints expressions. Each expression is separated by the value of the OFS vari‐ able. ***The output record is terminated with the value of the ORS variable.***

printf fmt, expr-list -- Format and print.

kemm
()
perl -anlF/:/ -e '$x{$ARGV}{defined $F[1] ? $F[0] : " " } = $F[1] || $F[0]; END{ print join("\t", keys %{$x{$ARGV}}); print join("\t", $_, values %{$x{$_}}) foreach keys %x }' file1 file2

Использован небольшой хак для обработки простых строк, не сохраняется порядок полей, предполагается, что во всех файлах поля одинаковые. Это всё легко доработать, но будет уже не однострочник (да и это однострочником можно назвать с натяжкой). Тем не менее задача для перла довольно простая.

anonymous
()
Ответ на: комментарий от kemm

спасибо. буду читать man awk.
(на момент предыдущего сообщения не было в этом возможности)
</thread>

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

в принципе, да, о perl я как-то тоже не подумал.
ведь достаточно было бы просто считать все значения (через тот же cut -d ":" -f 2-) и вывести их через разделитель \t (тем же tr "\n" "\t"), потом обединить отдельные (уже)строки в таблицу.

скрипт хорош, но вот беда: внутри одного файла попадаются одинаковые имена полей (сорри, забыл об этом сказать).
потому и порядок полей важен.
в любом случае, спасибо.

скорей всего в итоге замучу один скрипт на awk (ибо cut не справится со сторокой, которая идет без имени поля) с ORS="\t". а дальше cat.

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