Il arrive parfois que nous ayons besoin de scinder un fichier en deux fichiers de tailles égales (ou plus). Voici quelques lignes de commandes qui vous permettront de réaliser cette manipulation rapidement en utilisant la commande split.
La commande split
split découpe par défaut un fichier en plusieurs fichiers de 1000 lignes chacun nommés xaa, xab…
Les options intéressantes sont :
- -l number qui permet de définir le nombre de lignes par fichier
- -a number qui permet de définir la longueur du suffixe
- -d qui permet d’utiliser des suffixes numériques (00, 01…) plutôt qu’alphabétique
Par exemple, si on dispose d’un fichier de 42 lignes, on peut utiliser la commande ci-dessous :
pour créer des fichiers de 10 lignes portant les noms : split.txt.0, split.txt.1, split.txt.2, split.txt.3 et split.txt.4 (ce dernier ne contenant que 2 lignes).
Couper un fichier en deux
Pour couper un fichier en deux fichiers contenant le même nombre de lignes, nous pouvons utiliser les commandes suivantes :
$> LINE=`wc -l $FILE |cut -d" " -f1`
$> split -l `echo $LINE / 2 + 1| bc` -d -a 1 $FILE $FILE.
La première ligne permet de stocker le nom du fichier dans la variable FILE.
La seconde calcule le nombre de ligne du fichier et le stocke dans la variable LINE.
La troisième coupe le fichier en 2 en ajoutant un suffixe numérique à la fin du nom du fichier original (toto devient toto.0).
Script générique
Il est bien évidemment possible d’adapter ces commandes à ses besoins. Voici par exemple un script bash (Script de découpe de fichiers (222)) permettant de découper un fichier en N fichiers de taille identique :
USAGE='Usage split.sh [options] filename\nOptions :\n
-c N\tsplit filename in N files (default 2)\n
-o O\tprefixe output files with O (default filename plus dot)\n
-s N\tuse N-length suffixes (default 1)
'
# Need at least the filename
if [ $# -lt 1 ]; then
echo -e $USAGE;
exit 1
fi
# Fetch options
while getopts ":c:o:s::" optname
do
case "$optname" in
"c")
COUNT=$OPTARG
;;
"o")
PREFIXE=$OPTARG
;;
"s")
SUF_LENGTH=$OPTARG
;;
"?")
echo -e "Unknown option $OPTARG\n"$USAGE
exit 2
;;
":")
echo -e "No argument value for option $OPTARG\n"$USAGE
exit 1
;;
*)
echo "Unknown error while processing options"
exit 127
;;
esac
done
# Check that filename is present
if [ $OPTIND -gt $# ]; then
echo -e "filename missing\n"$USAGE
exit 5
fi
# and alone
if [ $# -gt $OPTIND ]; then
echo -e "too much arguments\n"$USAGE
exit 6
fi
FILE=${!OPTIND}
# Filename is there but does it exist?
if [ ! -r "$FILE" ]; then
echo -e "file $FILE does not exists or is not readable"
exit 7
fi
# Set default values for unset options
if [ "$COUNT" = "" ]; then
COUNT=2
fi
if [ "$PREFIXE" = "" ]; then
PREFIXE="$FILE."
fi
if [ "$SUF_LENGTH" = "" ]; then
SUF_LENGTH=1
fi
TOTAL_LINES=`wc -l $FILE |cut -d" " -f1`
LINES=`echo $TOTAL_LINES / $COUNT + 1| bc`
split -l $LINES -d -a $SUF_LENGTH $FILE $PREFIXE
Le script est loin d’être parfait (pas de vérification des valeurs passées en paramètre par exemple), mais il est suffisant dans la plupart des cas.



Leave a Reply