Comment supprimer des lignes vides d'un fichier Unix
j'ai besoin de supprimer toutes les lignes vides d'un fichier d'entrée et écrire dans un fichier de sortie. Voici mes données comme ci-dessous.
11216,33,1032747,64310,1,0,0,1.878,0,0,0,1,1,1.087,5,1,1,18-JAN-13,000603221321
11216,33,1033196,31300,1,0,0,1.5391,0,0,0,1,1,1.054,5,1,1,18-JAN-13,059762153003
11216,33,1033246,31300,1,0,0,1.5391,0,0,0,1,1,1.054,5,1,1,18-JAN-13,000603211032
11216,33,1033280,31118,1,0,0,1.5513,0,0,0,1,1,1.115,5,1,1,18-JAN-13,055111034001
11216,33,1033287,31118,1,0,0,1.5513,0,0,0,1,1,1.115,5,1,1,18-JAN-13,000378689701
11216,33,1033358,31118,1,0,0,1.5513,0,0,0,1,1,1.115,5,1,1,18-JAN-13,000093737301
11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802041926
11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802041954
11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802049326
11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802049383
11216,33,1036985,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000093415580
11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781202001
11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781261305
11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781603955
11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781615746
8 réponses
sed -i '/^$/d' foo
Cela dit sed
pour supprimer chaque ligne correspondant à l'expression rationnelle ^$
c'est à dire chaque ligne vide. -i
pavillon d'éditer le fichier en place, si votre sed
ne supporte pas que vous puissiez écrire la sortie dans un fichier temporaire et remplacer l'original:
sed '/^$/d' foo > foo.tmp
mv foo.tmp foo
si vous voulez aussi supprimer des lignes composées uniquement de Blancs (pas seulement des lignes vides) utilisez alors:
sed -i '/^[[:space:]]*$/d' foo
Edit: supprimez aussi les espaces à la fin des lignes, car apparemment, vous avez décidé que vous avez besoin que trop:
sed -i '/^[[:space:]]*$/d;s/[[:space:]]*$//' foo
awk 'NF' filename
awk 'NF > 0' filename
sed -i '/^$/d' filename
awk '!/^$/' filename
awk '/./' filename
NF également de supprimer des lignes ne contenant que des espaces ou des tabulations, les regex /^$/
n'est pas.
Utiliser grep correspondre à une ligne qui n'a rien entre le début d'ancrage (^
) et l'ancre d'extrémité ($
):
grep -v '^$' infile.txt > outfile.txt
si vous voulez supprimer des lignes avec seulement des espaces, vous pouvez toujours utiliser grep. J'utilise des expressions régulières Perl dans cet exemple, Mais voici d'autres façons:
grep -P -v '^\s*$' infile.txt > outfile.txt
ou, sans expressions régulières de Perl:
grep -v '^[[:space:]]*$' infile.txt > outfile.txt
sed -e '/^ *$/d' input > output
supprime toutes les lignes composées uniquement de blancs (ou complètement vides). Vous pouvez changer le blanc en [ \t]
\t
est une représentation d'onglet. Que ce soit votre coquille ou votre sed
va faire l'extension varie, mais vous pouvez probablement taper le caractère de l'onglet directement. Et si vous utilisez GNU ou BSD sed
, vous pouvez faire le modifier sur place, si c'est ce que vous voulez, avec le -i
option.
si j'exécute ce qui précède commande j'ai toujours des lignes vides dans mon fichier de sortie. Quelle pourrait être la raison?
Il peut y avoir plusieurs raisons. Il pourrait être que vous n'avez pas de lignes vides, mais vous avez beaucoup d'espaces à la fin d'une ligne, donc il semble que vous avez des lignes vides lorsque vous chat le fichier à l'écran. Si c'est ça le problème, alors:
sed -e 's/ *$//' -e '/^ *$/d' input > output
le nouveau regex supprime les blancs répétés à la fin de la ligne; voir la discussion précédente pour les blancs ou onglet.
une autre possibilité est que votre fichier de données provient de Windows et a des fins de ligne CRLF. Unix voit le retour du chariot à la fin de la ligne; ce n'est pas un blanc, donc la ligne n'est pas enlevée. Il ya plusieurs façons de le gérer. Un fiable est tr
supprimer (-d
) code de caractère octal 15, alias control-M or \r
ou retour chariot:
tr -d '5' < input | sed -e 's/ *$//' -e '/^ *$/d' > output
si ni l'un ni l'autre de ces travaux, alors vous devez montrer un dump hexadécimal ou un dump octal (od -c
) les deux premières lignes du fichier, afin que nous puissions voir ce que nous sommes contre:
head -n 2 input | od -c
à en Juger par les commentaires sed -i
ne fonctionne pas pour vous, vous ne travaillez pas sur Linux ou Mac OS X ou BSD - sur quelle plate-forme travaillez-vous? (AIX, Solaris, HP-UX viennent à l'esprit comme des possibilités relativement plausibles, mais il ya beaucoup d'autres moins plausibles aussi.)
vous pouvez essayer les classes de caractères nommés POSIX comme sed -e '/^[[:space:]]*$/d'
; il ne sera probablement travail, mais n'est pas garanti. Vous pouvez essayer avec:
echo "Hello World" | sed 's/[[:space:]][[:space:]]*/ /'
si ça marche, il y aura trois espaces entre le "bonjour" et le "monde". Si non, vous aurez probablement une erreur de sed
. Que pourriez vous épargner la douleur après l'obtention onglets tapé sur la ligne de commande.
grep . file
grep regarde ton fichier ligne par ligne; le point .
correspond à rien sauf un personnage newline. La sortie de grep est donc toutes les lignes qui se composent de quelque chose d'autre qu'une seule newline.
vous pouvez sed -i
possibilité de l'éditer en place sans l'aide d'un fichier temporaire:
sed -i '/^$/d' file
complète et supprimer des lignes même si ils comprennent des espaces ou des tabulations quelque chose comme ça en perl va le faire:
cat file.txt | perl -lane "print if /\S/"
totalement vide ^$
le ferait.
Cheers