2010-09-03 4 views
1

J'ai plusieurs fichiers avec des centaines de milliers d'enregistrements en format suivant:Parsing utilisant awk ou sed sous Unix

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

Il y a des champs séparés par des tuyaux et à l'intérieur d'un champ (dernier), il y a beaucoup d'autres champs séparés par des virgules. Ce que je veux faire est de stocker toutes ces valeurs dans la base de données. Pour l'exemple ci-dessus mes champs de DB seraient date-heure, nom de processus, identification de fil, numéro de séquence, nom d'API, transId, imdb, equipmentName, technologyName.
API Nom n'est pas dans un format fixe mais je peux supposer que c'est une longueur fixe.

S'il vous plaît laissez-moi savoir si je peux le faire dans Unix en utilisant awk ou sed.

Merci,

Répondre

6

Juste pour le plaisir: base de données

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 
+0

Wow, cela fonctionne comme un charme. Combien de temps cela vous a pris pour formater cette commande? Vous êtes formidable. Pouvez-vous également me dire si je veux générer une instruction comme celle-ci 'insérer dans les valeurs mytab (date_heure, nom_fil, seq_num, champ1, champ2) ('2010/02/09', 201,1001, 'Test', 'Test ') 'comment pouvez modifier la commande ci-dessus ou utiliser une autre commande pour formater la sortie de ci-dessus. Merci. –

+0

+1 puisque vous avez dit "juste pour le plaisir". Sinon, j'aurais downvoted une telle réponse diabolique :-) – mogsie

+0

C'est vraiment sympa, ça m'a aidé à en apprendre un peu plus sur sed. Que signifie ce qui suit: 's/\\ ([, =] \\)/\ 1/g' –

1

J'utiliser perl ou python pour faire le travail car ils fournissent des connecteurs DB pour la saveur différente des RPD. Je ne vois pas ce que vous voulez faire, awk ou sed, car ce sont des "text to text transformers".

Vous devez compléter votre question pour clarifier votre objectif (texte => script SQL par exemple) et cible DB si vous voulez un exemple de code.

+0

la plupart (sinon tous) fournissent également des clients de base de données qui peuvent exécuter des scripts SQL. – ghostdog74

1

Vous pouvez effectuer l'analyse au moins directement dans bash. Je ne sais pas ce que vous voulez faire avec les valeurs, mais ce script parse chaque ligne et affiche les différents champs:

#!/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 
2

oui, vous pouvez le faire au moins l'analyse syntaxique dans awk,

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

ce qui précède produit un tas d'instructions d'insertion. Vous pouvez soit les rediriger vers votre client de base de données, soit les enregistrer dans un fichier .sql, puis utiliser le client de base de données pour l'exécuter.

+0

Vous pouvez ensuite utiliser les outils de ligne de commande de la base de données pour effectuer une insertion. Par exemple. Pour mySQL ce serait "mysql -u username -p nom_base_de_données

Questions connexes