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
42
demandé sur Jonathan Leffler 2013-01-29 00:19:40

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
83
répondu Jonathan Wakely 2013-01-28 20:42:43
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.

35
répondu Jotne 2014-11-20 10:09:30

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
15
répondu gpojd 2013-01-28 20:35:19
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.

12
répondu Jonathan Leffler 2014-03-25 13:55:09
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.

7
répondu Ed Morton 2013-03-27 18:49:15

avec awk

awk 'NF > 0' filename

5
répondu Mirage 2013-01-29 01:13:18

vous pouvez sed -i possibilité de l'éditer en place sans l'aide d'un fichier temporaire:

 sed -i '/^$/d' file
2
répondu P.P. 2013-01-28 20:24:47

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

2
répondu G. Cito 2013-01-28 20:32:47