Как удалить пустые строки из файла Unix

Мне нужно удалить все пустые строки из входного файла и записывать в выходной файл. Вот мои данные, как показано ниже.

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 ответов


sed -i '/^$/d' foo

это говорит sed удалить каждую строку, соответствующую регулярному выражению ^$ т. е. каждая пустая строка. The -i флаг редактирует файл на месте, если ваш sed не поддерживает, что вы можете написать вывод во временный файл и замените оригинал:

sed '/^$/d' foo > foo.tmp
mv foo.tmp foo

если вы также хотите удалить строки, состоящие только из пробелов (а не только пустых строк), используйте:

sed -i '/^[[:space:]]*$/d' foo

Edit: также удалить пробелы в конце строк, потому что по-видимому, вы решили, что вам это тоже нужно:

sed -i '/^[[:space:]]*$/d;s/[[:space:]]*$//' foo

awk 'NF' filename

awk 'NF > 0' filename

sed -i '/^$/d' filename

awk '!/^$/' filename

awk '/./' filename

NF также удаляет строки, содержащие только пробелы или вкладки, регулярное выражение /^$/ нет.


использовать grep чтобы соответствовать любой линии, которая не имеет ничего между стартовым якорем (^) и конец якоря ($):

grep -v '^$' infile.txt > outfile.txt

если вы хотите удалить строки только с пробелами, вы все равно можете использовать grep. Я использую регулярные выражения Perl в этом примере, но вот другие способы:

grep -P -v '^\s*$' infile.txt > outfile.txt

или, без регулярных выражений Perl:

grep -v '^[[:space:]]*$' infile.txt > outfile.txt

sed -e '/^ *$/d' input > output

удаляет все строки, состоящие только из пробелов (или полностью пустые). Вы можете изменить пробел на [ \t] здесь \t является представлением для tab. Будь то ваша оболочка или ваш sed будет делать расширение варьируется, но вы, вероятно, можете ввести символ вкладки напрямую. И если вы используете GNU или BSD sed, вы можете сделать редактирование на месте, если это то, что вы хотите, с .


если я выполняю приведенную выше команду тем не менее, у меня есть пустые строки в моем выходном файле. Какая может быть причина?

там может быть несколько причин. Возможно, у вас нет пустых строк, но у вас есть много пробелов в конце строки, поэтому похоже, что у вас есть пустые строки, когда вы выводите файл на экран. Если это проблема, то:

sed -e 's/  *$//' -e '/^ *$/d' input > output

новое регулярное выражение удаляет повторяющиеся пробелы в конце строки; см. предыдущее обсуждение пробелов или вкладок.

другой возможно, что ваш файл данных пришел из Windows и имеет окончание строки CRLF. Unix видит возврат каретки в конце строки; он не является пустым, поэтому строка не удаляется. Есть несколько способов справиться с этим. Надежного tr удалить (-d) код символа восьмеричный 15, он же control-M или \r или возврата каретки:

tr -d '5' < input | sed -e 's/  *$//' -e '/^ *$/d' > output

если ни один из этих работ, то вам нужно показать шестнадцатеричный дамп или восьмеричный дамп (od -c) из первых двух строк файла, таким образом, мы можем видеть, с чем мы столкнулись:

head -n 2 input | od -c

судя по комментариям, что sed -i не работает для вас, вы не работаете на Linux или Mac OS X или BSD-на какой платформе вы работаете? (AIX, Solaris, HP-UX приходят на ум как относительно правдоподобные возможности, но есть и множество других, менее правдоподобных.)

вы можете попробовать POSIX именованные классы символов, такие как sed -e '/^[[:space:]]*$/d'; он, вероятно, будет работать, но не гарантируется. Вы можете попробуйте это:

echo "Hello World" | sed 's/[[:space:]][[:space:]]*/   /'

если это сработает, между "Hello" и "World" будет три пробела. Если нет, вы, вероятно, получите сообщение об ошибке от sed. Это может избавить вас от горя по поводу ввода вкладок в командной строке.


grep . file

grep смотрит на ваш файл строка за строкой; точка . что соответствует за исключением символ. Поэтому вывод из grep - это все строки, которые состоят из чего-то другого, чем одна новая строка.


С awk

awk 'NF > 0' filename


Вы можете ГДР -i возможность редактирования на месте без использования временного файла:

 sed -i '/^$/d' file

быть тщательным и удалить строки даже если они включают пробелы или вкладки, что-то вроде этого в perl сделает это:

cat file.txt | perl -lane "print if /\S/"

конечно, есть эквиваленты awk и sed. Лучше не предполагать, что строки полностью пустой как ^$ будет делать.

Ура