Bonjour,
j'ai le script suivant qui me sert à partir d'un fichier source, à concaténer les lignes qui sont découpées par erreur.
Exemple en entrée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
EMP1,S1,123,
H1W,BOX1
EMP2,S2,456,3R9,BOX2
EMP4,S4,789
,H9F,BOX3
Je dois avoir en sortie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
EMP1,S1,123,,H1W,BOX1
EMP2,S2,456,3R9,BOX2
EMP4,S4,789,,H9F,BOX3
Notez au passage qu'une ligne peut être tronquée avant ou après la virgule.

Le script que j'ai développé fonctionne bien mais j'aimerais l'améliorer (réduire le nombre d'étapes). Voici ce que j'ai fait :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh
 
echo "Input file : " $1
echo
 
# 1. Ecriture dans text2.txt des lignes avec ajout de "badline" pour les lignes incompletes (moins de 5 champs)
cat $1 | awk -F',' '{if (NF < 5 ) print "badline "$0; else print $0}' > test2.txt
 
# 2. Concatenation des lignes "badline" avec suppression du \n.
cat test2.txt | grep badline | sed 'N;s/\n/,/' | sed 's/badline //g' > testout_bad.txt
 
# 3. Redirection des lignes completes dans testout_good.txt
cat test2.txt | sed -n '/badline/!p' > testout_good.txt
 
# 4. Fusion des lignes incompletes et completes dans testout.txt
cat testout_good.txt testout_bad.txt | sort > testout.txt
 
cat testout.txt
J'ai tenté de jouer avec awk (next, ...) mais sans succès. Merci d'avance si vous avez une idée !