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