2009-11-26 7 views

Répondre

3

sed -i -e '1d' file fera ce que vous voulez.

  • -i indique "en place"
  • -e signifie "évaluer cette expression"
  • '1d' moyens, supprimer la première ligne
+0

"supprimer" est cher. pourquoi ne pas imprimer à partir de la ligne 2? – ghostdog74

1

Si votre fichier est plat, vous pouvez utiliser sed '1d' file > newfile

0

Je ne sais pas quelle est la taille de votre fichier, mais avez-vous essayé? awk 'NR > 1' {print}

+0

awk est trop gros canon pour ce travail. S'il veut faire cette opération de façon régulière (scriptée), awk n'est pas une solution "géniale" – Martin

+0

@Martin, expliquez trop gros canon. awk est l'un des outils de traitement de fichiers les plus rapides disponibles dans * nix. Si vous ne savez rien, ne commentez pas. – ghostdog74

+0

Quelle est la différence entre awk et sed à cet égard? – abyx

0

Je suis un peu rouillé sur perl, mais cela pourrait faire l'affaire:

#!/usr/bin/perl 
$first = true; 
while (<>) 
{ 
    if ($first) 
    { 
     # skip first line 
     $first = false; 
    } 
    else 
    { 
     print; 
    } 
} 

et utiliser ce script comme un filtre:

cat myfile.txt | removefirstline.pl > myfile_2.txt 
+0

Ceci est probablement exagéré considérant qu'il peut être fait avec des outils de manipulation de texte unix de base;). –

+1

son pas exagéré. Perl est juste un autre outil pour faire le travail. >> perl -ne 'imprimer si $. > 1 'fichier – ghostdog74

+0

wow. Perl one-liners me fait toujours paniquer. Aimer! –

1

Essayez la commande suivante:

sed -n '2,$p' file 
+0

et -i pour remplacer le contenu du fichier original – Martin

1

En supposant queue de GNU coreutils:

tail -n +2 file > newfile 
1
tail -n +2 <source> destination 

arrière avec nombre positif sorties tout en commençant par N-ème ligne.

+0

dépend du système et la version de la queue – Martin

6

Vous pouvez utiliser une variété d'outils dans * nix. Une comparaison de certaines des différentes méthodes sur un fichier avec plus de 1,5 million de lignes.

$ wc -l < file4 
1700589 

$ time sed -n '2,$p' file4 > /dev/null 

real 0m2.538s 
user 0m1.787s 
sys  0m0.282s 

$ time awk 'NR>1' file4 > /dev/null 

real 0m2.174s 
user 0m1.706s 
sys  0m0.293s 

$ time tail -n +2 file4 >/dev/null 

real 0m0.264s 
user 0m0.067s 
sys  0m0.194s 

$time more +2 file4 > /dev/null 

real 0m11.771s 
user 0m11.131s 
sys  0m0.225s 

$ time perl -ne 'print if $. > 1' file4 >/dev/null 

real 0m3.592s 
user 0m3.259s 
sys  0m0.321s 
+0

+1 pour les timings des différentes solutions, qui fonctionnent et sont beaucoup plus élégant que d'autres suggestions ici – I82Much

0
function cutline($filename,$line_no=-1) { 

$strip_return=FALSE; 

$data=file($filename); 
$pipe=fopen($filename,'w'); 
$size=count($data); 

if($line_no==-1) $skip=$size-1; 
else $skip=$line_no-1; 

for($line=0;$line<$size;$line++) 
if($line!=$skip) 
fputs($pipe,$data[$line]); 
else 
$strip_return=TRUE; 

return $strip_return; 
} 

cutline('foo.txt',1); // deletes line 1 in foo.txt 
} 
+0

'$ data = fichier ($ filename);' lit l'ensemble fichier. –

Questions connexes