J'ai plusieurs fichiers qui contiennent des informations de texte ascii dans les 5 à 10 premières lignes, suivies d'informations de matrice bien tabulées. Dans un script Shell, je souhaite supprimer ces premières lignes de texte afin de pouvoir utiliser les informations de matrice pure dans un autre programme. Comment puis-je utiliser les commandes bash Shell pour cela?
Si c'est une aide, j'utilise RedHat et un système Linux Ubuntu.
Tant que le fichier n'est pas un lien symbolique ou un lien dur, vous pouvez utiliser sed, tail ou awk. Exemple ci-dessous.
$ cat t.txt
12
34
56
78
90
$ sed -e '1,3d' < t.txt
78
90
Vous pouvez également utiliser sed sur place sans fichier temporaire: sed -i -e 1,3d yourfile
. Cela ne fera écho à rien, cela modifiera simplement le fichier sur place. Si vous n'avez pas besoin de diriger le résultat vers une autre commande, c'est plus facile.
$ tail -n +4 t.txt
78
90
$ awk 'NR > 3 { print }' < t.txt
78
90
sed -i '1,3d' file.txt
Cela supprime les 3 premières lignes du fichier.txt.
Si les lignes tabulées sont celles qui ont un caractère de tabulation:
grep '␉' <input_file >output_file
(␉
étant un caractère de tabulation littéral) ou de manière équivalente
sed -n '/␉/p' <input_file >output_file
Dans un script bash/ksh/zsh, vous pouvez écrire $'\t'
pour un onglet, par exemple grep $'\t'
ou sed -n $'/\t/p'
.
Si vous souhaitez supprimer 10 lignes au début du fichier:
tail -n +11 <input_file >output_file
(notez que c'est +11
pour éliminer 10 lignes, car +11
signifie "commencer à la ligne 11" et les numéros de queue des lignes à partir de 1) ou
sed '1,10d' <input_file >output_file
Sous Linux, vous pouvez profiter de GNU sed's -i
option pour modifier les fichiers en place:
sed -i -n '/\t/p' *.txt
Ou vous pouvez utiliser une boucle Shell et des fichiers temporaires:
for x in *.txt; do
tail -n +11 <"$x" >"$x.tmp"
mv "$x.tmp" "$x"
done
Ou si vous ne souhaitez pas modifier les fichiers en place, mais donnez-leur plutôt un nom différent:
for x in *.txt; do
tail -n +11 <"$x" >"${x%.txt}.data"
done
Vous pouvez utiliser Vim en mode Ex:
ex -sc '1d5|x' file
1
passer à la première ligne
5
sélectionnez 5 lignes
d
supprimer
x
enregistrer et fermer
# deletes first line
echo "a\nb" | sed '1d'
# read list.txt and write list.csv without first line
cat list.txt | sed '1d' > list.csv
Autres commandes utiles:
# finds first character (pipe|)
grep '^|'
# deletes pipe
sed 's/|//g'
# deletes space
sed 's/ //g'
À l'aide de bash
, pour nettoyer un fichier en utilisant un nombre en pourcentage au lieu d'un nombre absolu de lignes:
sed -i -e 1,$( printf "$((`cat php_errors.log | wc -l` * 75 /100 ))" )d php_errors.log
Attention car cette commande peut être destructrice car elle supprime le contenu sur place, sans créer de copie.
Il supprime les 75% des premières lignes du fichier mentionné.