Intereting Posts
Удаление файлов резервных копий в соответствии с правилами Как определить тип памяти в Linux? Безопасный способ разрешить любому пользователю запускать программы в определенном сетевом пространстве имен yum install kernel-devel: «Нечего делать» Как название группы работает при создании любого файла? Установлен из исходного кода, но при проверке установленной версии он показывает старую версию. Как отремонтировать? возможно ли программно изменить рабочий каталог родительской оболочки? Как включить имя сеанса в строку состояния для beobu-tmux? Переименование текстового файла с помощью скрипта Где выходят выходные задания `at` и` cron`? gdbserver как ненадлежащая сломанная труба Как управлять всеми параметрами сценария оболочки сразу? Как прекратить добавление дополнительных символов новой строки Как удалить данные, которые появляются из «строк» ​​в файле? Iptables – лимитные соединения для каждого порта

Как удалить все строки, которые имеют одно значение в строке?

У меня есть файл как следующий

input file 0.0 4 6 5 1 2 9 4 5 1 ..... 0.25 0.5 3 1 1.0 3 7 8 2 1.5 3 3 3 4 6 4 5 2.0 2.5 6 7 6 9 

Я хочу удалить все строки, которые имеют только одно значение в строке, поэтому результат будет таким, как это

 out file 0.0 4 6 5 1 2 9 4 5 1 ..... 0.5 3 1 1.0 3 7 8 2 1.5 3 3 3 4 6 4 5 2.5 6 7 6 9 

Один подход с использованием awk . Использует NF (количество полей) только для печати строк, где число полей больше 1.

 awk <oldfile >newfile 'NF>1' 

пример

 awk <oldfile >newfile 'NF>1' cat newfile 0.0 4 6 5 1 2 9 4 5 1 ..... 0.5 3 1 1.0 3 7 8 2 1.5 3 3 3 4 6 4 5 2.5 6 7 6 9 

Для того чтобы было два или более чисел, тогда должен быть хотя бы один разделитель. Если это space то grep будет просто

 grep ' ' 

Если у вас файл может иметь посторонние пробелы в конце строки, тогда найдите пробел, за которым следует цифра или . (в случае, если число может быть .25 ).

 grep ' [0-9.]' 

Если у вас могут быть посторонние пробелы в начале или конце и дополнительные промежутки в середине, тогда

 grep '[0-9.] *[0-9].' 

Вы можете сделать это с помощью grep или sed.

С sed :

 sed -e '/^[[:space:]]*[[:digit:].]\+[[:space:]]*$/d' input >output 

С помощью grep используйте параметр -E для регулярных выражений и -v для исключения совпадений:

 grep -v -E '^[[:space:]]*[[:digit:].]+[[:space:]]*$' input >output 

Причиной шаблона является игнорирование строк, которые не имеют числового значения, и обрабатывать случаи с ведущими или завершающими пробелами. Если ничто из этого не представляет интереса, более простое решение «работает».