Удаление линий, если в пятом столбце есть точка

У меня есть файл, и я хочу удалить всю строку, если она имеет точку в 5-м столбце.

Входной файл:

sc2/80 20 . AC 80 PASS N=2 F=5;U=4 sc2/60 55 . G . 72 PASS N=2 F=5;U=4 sc2/68 20 . TA 71 PASS N=2 F=5;U=4 sc2/10 24 . T . 31 PASS N=2 F=5;U=4 sc2/40 59 . T . 31 PASS N=2 F=5;U=4 sc2/24 24 . AG 38 PASS N=2 F=5;U=4 

Ожидаемый результат:

 sc2/80 20 . AC 80 PASS N=2 F=5;U=4 sc2/68 20 . TA 71 PASS N=2 F=5;U=4 sc2/24 24 . AG 38 PASS N=2 F=5;U=4 

Примечание. Файл имеет размер 64G и содержит 690 000 000 строк. Есть ли эффективное решение, так как это довольно большой набор данных. Я бы предпочел Алка и Седа, поскольку я новичок в этой области. Спасибо за вашу помощь.

Вы можете попробовать это

 awk '{ if ( $5 != "." ) { print $0; } }' input_file.Txt > output_file.txt 

Это проверит, если 5-й столбец не является точкой и отображает строку.

С помощью grep , считая, что столбцы разделены на вкладку, здесь используется код ksh93 / zsh / bash $'...' :

 LC_ALL=C grep -v $'^\([^\t]*\t\)\{4\}\.\t' 

Если столбцы разделены любым количеством пробелов:

 LC_ALL=C grep -vE '^([^[:blank:]]+[[:blank:]]+){4}\.[[:blank:]]' 

GNU grep обычно быстрее, чем awk (особенно GNU awk ) или sed . Установка языка на C обычно ускоряет работу.

 awk '$5 != "."' your-big-file # from manatwork's comment 

или

 sed -n '/^ *[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+\. /!p' your-big-file 

Портативная версия комментария Stephane Chazelas:

 sed -n '/^ *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *\. /!p' your-big-file 

Версия sed предполагает, что разделитель – это пространство, но вы можете его адаптировать.

Представление:

Намрата сказал (комментарий), что сценарий sed быстрее, чем awk . Стефан Чазелас считает, что эквивалент grep может быть еще быстрее …