Если ваши поля никогда не могут содержать пробелы, пустое поле означает либо табуляцию в качестве первого символа ( ^ \ t
), либо табуляция как последний символ ( \ t $
) или две последовательные табуляции ( \ t \ t
).Поэтому вы можете отфильтровать строки, содержащие любые из них:
grep -Ev $'^\t|\t\t|\t$' file
Если у вас есть пробелы, все становится сложнее. Если ваши поля могут начинаться с пробелов, используйте это вместо этого (поле с пробелами считается пустым):
grep -Pv '\t\s*(\t|$)|\t$|^\t' file
Изменение отфильтровывает строки, соответствующие табуляции, за которой следует 0 или более пробелов, а затем либо другая табуляция, либо конец линия.
Это также не сработает, если последнее поле не содержит ничего, кроме пробелов. Чтобы избежать этого, используйте perl
с параметрами -F
и -a
, чтобы разделить ввод в массив @F
, сообщив ему для печати, если одно из полей не пусто ( / ^ $ /
):
perl -F'\t' -lane 'print unless grep{/^$/} @F' file