web-dev-qa-db-fra.com

Comment supprimer les n premières lignes d'un fichier ascii à l'aide des commandes Shell?

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.

108
Paul

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

$ 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.

queue

$ tail -n +4 t.txt
78
90

awk

$ awk 'NR > 3 { print }' < t.txt
78
90
165

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

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

15
alhelal

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. 1 passer à la première ligne

  2. 5 sélectionnez 5 lignes

  3. d supprimer

  4. x enregistrer et fermer

2
Steven Penny
# 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' 
0
Samran Elahi

Par pourcentage

À 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é.

0
pgr