Удалить строки, в которых любой из столбцов пуст.

Удалить строки, в которых любой из столбцов пуст.

У меня есть большой текстовый файл, разделенный двоеточиями, содержащий два столбца, например:

valueA:valueB
valueC:
valueD:valueE
:valueG

Если слева нет данныхилисправа от двоеточия я хочу удалить всю строку:

valueA:valueB
valueD:valueE

Как бы я это сделал?

Самое близкое, что у меня есть, это что-то вроде:

awk -F : '$2!=""' file > final_output

Но это, похоже, соответствует всему, независимо от того, содержит ли строка пустой столбец или нет.

решение1

Ваша awkкоманда правильно сохраняет valueA:valueBи valueD:valueEпримеры строк, и удаляет строку valueC:(поэтому я не уверен, что вы имеете в виду под «кажется, соответствуетвсе").

Команда сохраняется :valueG, поскольку вы вообще не проверяете первое поле.

«Не печатать строки, в которых хотя бы один из двух столбцов пуст» можно закодировать awkтак:

awk -F : '! ( $1=="" || $2=="" )'

Задача эквивалентна «вывести только строки, в которых каждый столбец непустой»:

awk -F : '$1!="" && $2!=""'

Примечание awk— это инструмент, который очень хорошо подходит для решения этой проблемы. Наши две строки отражают желаемую логику в терминах «разделитель» ( -F :), «столбцы»/«поля» ( $1, $2) «пустота» ( …=="") и т. д. Могут быть решения с другими инструментами, но их работа не обязательно будет выражать логику так ясно. Например, с помощью grep:

grep '.:.'

Вышеуказанная команда отлично работает и она проще, чем те awk. Ее форма не отражает напрямую суть проблемы. Хотя ее минимализм эстетически мне нравится, я все равно думаю, что awkэто Правильная Вещь.

решение2

С помощью sed и трех sкоманд:

sed 'N; s/\n:/:/; s/\n/:/; s/:$//' file

Выход:

значениеA:значениеB:значениеC
значениеD:значениеE:значениеG

От man sed:

N: Добавить следующую строку ввода в пространство шаблона

Связанный контент