Je souhaite diviser un fichier texte en fonction d'un ensemble prédéfini de lignes.
Par exemple. J'ai un fichier
a
b
c
d
e
f
Et puis j'ai les ensembles de lignes suivants (ceux-ci pourraient être stockés mais c'est plus pratique, sur un seul fichier, plusieurs fichiers,…).
1,2
3,6
5,4
Je souhaite diviser mon fichier afin de récupérer 3 fichiers comme :
fichier1
a
b
fichier2
c
f
fichier3
e
d
Réponse acceptée :
Voici un bash
script en supposant que votre fichier d'entrée est nommé infile et que les plages sont stockées 1 par ligne dans un fichier nommé splits :
i=1
for range in $(< splits); do
sed -n "$(echo "$range" | cut -f1 -d, )p" infile > "file$i"
sed -n "$(echo "$range" | cut -f2 -d, )p" infile >> "file$i"
((i++))
done
Cela utilise simplement sed
pour imprimer les lignes spécifiées par les plages, et enregistre chaque résultat dans un nouveau fichier (les fichiers créés sont nommés fichier1 fichier2 fichier3 etc.). Deux invocations de sed
sont utilisés pour préserver l'ordre spécifié des lignes.
Notez qu'il n'y a pas de vérification de format ou d'erreur effectuée par ce script simple, et les fichiers existants nommés par ex. fichier1 sera écrasé.
Une alternative simplifiée (avec l'aimable autorisation de @muru) utilisant while read
et laisser bash diviser les plages au lieu de couper :
i=1
while IFS=',' read n1 n2
do
sed -n "$n1 p; $n2 p" infile > "file$i"
((i++))
done < splits
Si l'ordre des lignes dans les fichiers de sortie est important (par exemple les lignes 5,4 !=4,5), alors le sed
bit devra être divisé en deux invocations distinctes similaires au premier script.