Comment puis-je supprimer les n premières lignes d'un fichier ascii à l'aide de commandes shell?

93

J'ai plusieurs fichiers qui contiennent des informations textuelles ASCII dans les 5-10 premières lignes, suivies d'informations matricielles bien tabulées. Dans un script shell, je souhaite supprimer ces premières lignes de texte afin de pouvoir utiliser les informations de matrice pures dans un autre programme. Comment puis-je utiliser les commandes du shell bash pour faire cela?

Si cela peut vous aider, j'utilise RedHat et un système Linux Ubuntu.

Paul
la source

Réponses:

144

Tant que le fichier n'est pas un lien symbolique ou un lien physique, vous pouvez utiliser sed, tail ou awk. Exemple ci-dessous.

$ cat t.txt
12
34
56
78
90

sed

$ sed -e '1,3d' < t.txt
78
90

Vous pouvez également utiliser sed en place sans un 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 simple.

queue

$ tail -n +4 t.txt
78
90

awk

$ awk 'NR > 3 { print }' < t.txt
78
90
Ignacio Vazquez-Abrams
la source
8
Vous pouvez également utiliser sed en place sans un 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 simple.
Yanick Girouard
1
Merci @YanickGirouard, @IgnacioVazquezAbrams! Vous deux, vous venez de me sauver une tonne de travail manuel sur mes recherches! :)
Paul
2
@Svetlana en sed -iparticulier. La plupart des implémentations suppriment simplement le fichier et le remplacent par un nouveau fichier, ce qui ne fonctionne pas pour les liens car vous laissez l'original à son autre emplacement.
jw013
6
que diriez-vous d'expliquer ce que '1,3d', +4, etc. veux dire? La question était pour n lignes, mais vous n'avez pas dit ce que n est (car apparemment, n est 2 dans vos exemples, bien que ce ne soit pas évident pour un noob de ce qu'il faut changer pour changer n)
Robin Manoli le
3
Cela utilise un fichier temporaire, donc pas très utile pour un espace disque 100% util. Il serait intéressant d'avoir une solution qui le fasse littéralement "sur place".
Shai le
11

sed -i '1,3d' file.txt

Cela supprime les 3 premières lignes de fichier.txt.

Alhelal
la source
Je dois supprimer les 50 premières lignes d'un fichier texte de 10 Go +. Même si elle est supposée fonctionner "sur place", cette commande prend encore quelques minutes. Y a-t-il une alternative vraiment rapide?
Sébastien il y a
6

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 équivalent

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 éliminer 10 lignes au début du fichier:

tail -n +11 <input_file >output_file

(notez que c’est +11pour éliminer 10 lignes, car cela +11signifie «commencez à partir de la ligne 11» et les numéros de queue de 1) ou

sed '1,10d' <input_file >output_file

Sous Linux, vous pouvez utiliser l' -ioption de GNU sed 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 voulez pas modifier les fichiers à la place, mais leur donner un nom différent:

for x in *.txt; do
  tail -n +11 <"$x" >"${x%.txt}.data"
done
Gilles
la source
3
"tabulé" signifie généralement "joli imprimé dans un tableau", pas "en retrait avec des caractères de tabulation".
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams je sais. Le tableau joliment imprimé utilise parfois des caractères de tabulation, ce qui est plus facile à repérer que les colonnes alignées. Bien sûr, si Paul donnait un exemple d'entrée, je pourrais donner un meilleur ajusteur.
Gilles
2

Vous pouvez utiliser Vim en mode Ex:

ex -sc '1d5|x' file
  1. 1 passer à la première ligne

  2. 5 sélectionnez 5 lignes

  3. d effacer

  4. x sauver et fermer

Steven Penny
la source
0

echo "a \ nb" | sed '1d' # supprime la première ligne

cat list.txt | sed '1d'> list.csv # lit le fichier list.txt et écrit le fichier list.csv sans la première ligne

Autres commandes utiles:

grep '^ |' # trouve le premier caractère (pipe |)

sed 's / | // g' # supprime le tuyau

sed 's / // g' # supprime l'espace

Samran Elahi
la source
0

En pourcentage

En utilisant bash, pour nettoyer un fichier en utilisant un 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

Faites attention, car cette commande peut être destructive car elle supprime le contenu sur place, sans créer de copie.

Il supprime les premiers 75% de lignes du fichier mentionné.

pgr
la source