Как удалить пустые строки из файла 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 представляют собой все строки, которые состоят из чего-то другого, кроме одной новой строки.
Чтобы быть тщательным и удалять строки, даже если они содержат пробелы или табуляции, что-то вроде этого в Perl сделает это
cat file.txt | perl -lane "print if /\S/"
Конечно, есть эквиваленты awk и sed. Лучше не предполагать, что строки абсолютно пусты, так как ^$
сделал бы.
ура
Вы можете седь -i
возможность редактирования на месте без использования временного файла:
sed -i '/^$/d' file