Подтвердить что ты не робот

Как удалить пустые строки из файла 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
4b9b3361

Ответ 1

sed -i '/^$/d' foo

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

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

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

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

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

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

Ответ 2

awk 'NF' filename

awk 'NF > 0' filename

sed -i '/^$/d' filename

awk '!/^$/' filename

awk '/./' filename

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

Ответ 3

Используйте 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

Ответ 4

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, aka 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 spring, чтобы рассматривать как относительно правдоподобные возможности, но есть много других менее правдоподобных).

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

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

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

Ответ 5

grep . file

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

Ответ 6

с awk

awk 'NF > 0' filename

Ответ 7

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

 sed -i '/^$/d' file

Ответ 8

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

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

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

Приветствия