Как удалить пустые строки из файла 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 удалить каждую строку, соответствующую регулярному выражению ^$ т.е. каждая пустая строка. -i флаг редактирует файл на месте, если ваш sed не поддерживает, что вы можете записать вывод во временный файл и заменить оригинал:

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

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

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

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

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 это представление для таб. Будь то ваша оболочка или ваш sed будет делать расширение варьируется, но вы, вероятно, можете ввести символ табуляции напрямую. И если вы используете GNU или BSD sed, вы можете сделать редактирование на месте, если это то, что вы хотите, с помощью -i вариант.


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

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

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

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

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

tr -d '\015' < 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:]]*/   /'

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

grep . file

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

С awk

awk 'NF > 0' filename

Чтобы быть тщательным и удалять строки, даже если они содержат пробелы или табуляции, что-то вроде этого в Perl сделает это

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

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

ура

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

 sed -i '/^$/d' file
Другие вопросы по тегам