У меня есть большой текстовый файл, разделенный двоеточиями, содержащий два столбца, например:
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
: Добавить следующую строку ввода в пространство шаблона