Разбор с использованием awk или sed в Unix - PullRequest
1 голос
/ 03 сентября 2010

У меня есть несколько файлов с сотнями тысяч записей в следующем формате:

2010/08/10 10:07:52|TrainZoom|1393|38797|MyCustomerAPI->,mask = ZPTA,TransId = 1281460071578,testing :-> , capture -> : , IMDB = 9113290830, equipmentName = GMT, technologyName = RMS,,,)|

Есть поля, разделенные трубами, а внутри поля (последнее) есть много других полейразделенных запятыми.Я хочу сохранить все эти значения в базе данных.Для приведенного выше примера мои поля БД будут иметь дату, время, имя процесса, идентификатор потока, порядковый номер, имя API, transId, imdb, equipmentName, technologyName.
Имя API не имеет фиксированного формата, но я могупредположим, что это фиксированная длина.

Пожалуйста, дайте мне знать, если я могу сделать это в Unix, используя awk или sed.

Спасибо,

Ответы [ 4 ]

7 голосов
/ 03 сентября 2010

Просто для удовольствия:

cat file.txt | sed -e 's/\([^|]*\)|\([^|]*\)|\([^|]*\)|\([^|]*\)|/insert into table set date-time=\1, process-name=\2, thread-id=\3, sequence-num=\4, /' -e 's/,[^=]*,/,/g' -e 's/ \([,=]\)/\1/g' -e 's/\([,=]\) /\1/g' -e 's/\([^,]*\)=\([^,]*\),/\1="\2",/g' -e 's/"[^"]*$/";/' | mysql dbname
2 голосов
/ 03 сентября 2010

да, вы можете сделать хотя бы разбор в awk,

awk -F"|" 'BEGIN{q="\047"}
{
 printf "insert into table values("
 printf q $1 q","q $2,","
 # fill up the rest yourself
}
' file  

Выше приведено несколько операторов вставки. Вы можете либо передать их клиенту вашей базы данных, либо сохранить их в файл .sql, а затем использовать клиент базы данных для его выполнения.

1 голос
/ 03 сентября 2010

Вы можете выполнить разбор, по крайней мере, непосредственно в bash.Я не уверен, что вы хотите сделать со значениями, но этот скрипт анализирует каждую строку и отображает отдельные поля:

#!/bin/bash

while IFS='|' read dateTime processName threadId sequenceNum other; do
    IFS=',' read apiName mask transId testing capture imdb equipmentName technologyName other <<< "$other"

    echo "date-time:       $dateTime"
    echo "process-name:    $processName"
    echo "thread-id:       $threadId"
    echo "sequence-num:    $sequenceNum"
    echo "api-name:        $apiName"
    echo "trans-id:        $transId"
    echo "imdb:            $imdb"
    echo "equipment-name:  $equipmentName"
    echo "technology-name: $technologyName"
done
1 голос
/ 03 сентября 2010

Я бы использовал Perl или Python для этой работы, так как они предоставляют коннекторы БД для разных типов БД.Я не понимаю, что вы хотите от awk или sed, так как они являются «преобразователями текста в текст».

Вы должны завершить свой вопрос, чтобы уточнить свою цель (например, text => sql script?) И целевую БД, если вам нужен пример кода.

...