BlogoFlip - Philippe Maladjian

Péripéties bucoliques d'un administrateur systèmes au royaume de la virtualisation, du stockage et accessoirement photographe à ses heures perdues

BlogoFlip - Philippe Maladjian

Péripéties bucoliques d'un administrateur systèmes au royaume de la virtualisation, du stockage et accessoirement photographe à ses heures perdues

22
juin 2009

[Awk] Recomposer un enregistrement sur 2 lignes en 1

Rédigé par  Aucun commentaire   Mis à jour le  22/06/2009

La semaine dernière au boulot j'ai eu à traiter un fichier qui contenait 34 000 lignes. C'était un export provenant d'une base de données. La structure était du csv mais très particulière puisqu'un enregistrement était répartie sur 2 lignes avec un pseudo index. Le but était de garder la même structure et les mêmes champ sauf que chaque enregistrement devaient être sur 1 seul ligne. Bien sûr l'opération inverse devrait être réalisé.

Après pas mal de recherche j'ai décidé d'en faire un petit script histoire de le re-utiliser par la suite en adaptant le nombre de lignes et de champ par enregistrement.

#!/bin/bash

file="/tmp/artsub.txt"
export_file="/tmp/export_file.csv"
out_file="/tmp/out_file.csv"
line=1
nbline=`wc -l <$file`
i=1
	
# Transformation du fichier 2 lignes en 1 avec
# séparteur ;
if [ "$1" == "csv" ]
then
	echo "Transformation du fichier en cours, merci de patienter"
	while [ $i -lt $nbline ]
	do
		echo -n "."
		line=$i
		LIGNE1=`awk 'NR=='"$line"' { print $0 }' $file`

		let "line+=1"
		LIGNE2=`awk 'NR=='"$line"' { print $0 }' $file`

		echo $LIGNE1";"$LIGNE2 >> $export_file

		let "i+=2"
	done
	echo "Fichier $export_file créé"
fi

# Transformation du fichier 1 ligne au format
# csv sur 2 lignes
if [ "$1" == "export" ]
then
	echo "Transformation du fichier, merci de patienter"
	cat $export_file | while read line
	do
		echo -n "."
		VAR1=`echo $line | cut -d ";" -f1`
		VAR2=`echo $line | cut -d ";" -f2`
		VAR3=`echo $line | cut -d ";" -f3`
		VAR4=`echo $line | cut -d ";" -f4`
		VAR5=`echo $line | cut -d ";" -f5`
		VAR6=`echo $line | cut -d ";" -f6`
		VAR7=`echo $line | cut -d ";" -f7`
		VAR8=`echo $line | cut -d ";" -f8`

		echo "$VAR1;$VAR2;$VAR3;$VAR4" >> $out_file
		echo "$VAR5;$VAR6;$VAR7;$VAR8" >> $out_file
	done
fi

if [ "$1" == "" ]
then
	echo "Paramètre incorrecte"
	echo "$0 csv : Transforme le fichier $file 2 lignes ligne en 1"
	echo "$0 export : Transforme le fichier $export_file 1 ligne en 2 lignes pour l'importer dans X3"
	exit 1
fi

exit 0

Administrateur système de métier mais surtout curieux de découvrir de nouvelles technos très orientées DIY. A mes heures perdues je fais de la photo avec toujours une petite envie d'intégrer des DIY sous forme de timelaps à base de raspberry.

Écrire un commentaire

Quelle est la dernière lettre du mot sneugc ? :

[Awk] Recomposer un enregistrement sur 2 lignes en 1 - BlogoFlip - Philippe Maladjian - Péripéties bucoliques d'un administrateur systèmes au royaume de la virtualisation, du stockage et accessoirement photographe à ses heures perdues