Чтобы удалить лишнее пространство из строки с помощью команды оболочки

Это мой файл,

TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y 

У меня проблема выравнивания из строки после начала цифры 10. И я хочу, чтобы указанный ниже формат,

 TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y 

  • Получить строку запроса из URL-адресов в файле журнала
  • дифференцируя два файла и получая уникальный результат в третьем
  • Отфильтруйте содержимое буфера обмена без использования промежуточного файла
  • Соедините каждую строку файла с определенной переменной во второй команде
  • цикл через выход одной команды и использовать в другой команде
  • Найти и заменить с помощью sed с помощью подстановочных знаков при поиске и замене
  • Как использовать регулярное выражение с AWK для замены строки?
  • условная окраска в grep
  • 5 Solutions collect form web for “Чтобы удалить лишнее пространство из строки с помощью команды оболочки”

    Эта команда sed фиксирует данный результат:

     sed 's=\(D[CP] *./../.\) =\1=g' 

    Он удаляет одно место после ./../. после DC и DP. Если другие цифры могут увеличиться, sed тоже, вероятно, не самый подходящий инструмент для работы.

    Правильным инструментом для этого задания является column . Вы можете указать разделитель столбцов с -o (на OS X это -s ), например:

     column -t -o ' ' file 

    дает

     TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y 

    В этом конкретном случае достаточно просто изменить все вхождения двух или более пробелов на вкладку:

     sed 's/ */\t/g' file 

    Для более общего решения вы можете убедиться, что каждый столбец печатается с правой шириной, используя printf . Вы можете сделать это прямо в оболочке:

     $ while read line; do printf '%-8s%-6s%-7s%-3s%-8s%-3s%-7s%-2s%-2s\n' $line; done < file TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y 

    Или, более безопасно для произвольного ввода:

     $ while read abcdefghi; do printf '%-8s%-6s%-7s%-3s%-8s%-3s%-7s%-2s%-2s\n' "$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h" "$i"; done < file TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y 

    Вы могли бы сделать это быстрее и лаконично, используя что-то вроде perl :

     $ perl -lane 'printf "%-8s%-6s%-7s%-3s%-8s%-3s%-7s%-2s%-2s\n",@F' file TLRUIDA CBdms Status DP 6/1/1 DC 6/1/5 0 Y TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y 

    Преимущество использования printf заключается в том, что вы можете указать минимальную ширину столбца для каждого столбца. Это означает, что если один из ваших столбцов может иметь гораздо более высокую ценность, он все равно будет работать. Например, если первым полем одной из ваших линий может быть averylongfieldindeed , вы можете установить минимальную ширину 1-го столбца averylongfieldindeed 21 и выровнять вывод:

     $ perl -lane 'printf "%-21s%-6s%-7s%-3s%-8s%-3s%-7s%-2s%-2s\n",@F' file averylongfieldindeed CBdms Status DP 6/1/1 DC 6/1/5 0 Y TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y 

    В отличие от этого, использование вкладок не будет работать:

     $ sed -e "s/\s\+/\t/g" file averylongfieldindeed CBdms Status DP 6/1/1 DC 6/1/5 0 Y TLRUIDA CBdms Status DP 6/2/1 DC 6/2/5 0 Y TLRUIDA CBdms Status DP 6/3/1 DC 6/3/5 0 Y TLRUIDA CBdms Status DP 6/4/1 DC 6/4/5 0 Y TLRUIDA CBdms Status DP 6/5/1 DC 6/5/5 0 Y TLRUIDA CBdms Status DP 6/6/1 DC 6/6/5 0 Y TLRUIDA CBdms Status DP 6/7/1 DC 6/7/5 0 Y TLRUIDA CBdms Status DP 6/8/1 DC 6/8/5 0 Y TLRUIDA CBdms Status DP 6/9/1 DC 6/9/5 0 Y TLRUIDA CBdms Status DP 6/10/1 DC 6/10/5 0 Y TLRUIDA CBdms Status DP 6/11/1 DC 6/11/5 0 Y TLRUIDA CBdms Status DP 6/12/1 DC 6/12/5 0 Y 

    у нас есть очень простая команда для этого:

     tr -s ' ' <input-file >output-file 

    -s удаляет появление <space> (или любого символа, следующего за ним в командной строке)

    Если вам нужны хорошие столбцы на выходе терминала, вы не должны использовать пробелы, но символы, называемые «TAB». Команда sed oneliner, которая заменяет все ваши пространства с помощью TAB, следующая

     sed -i -e "s/\s\+/\t/g" your_input_file 
    Interesting Posts

    Как получить необходимую информацию, чтобы использовать unison и ssh для синхронизации файлов

    Извлечение нескольких файлов .tar.gz с помощью одного вызова tar

    Проблемы с производительностью ZFS (по Linux)

    Как размножить файл данных с другим файлом данных индекса?

    разрешить все IP-адреса в выводе команды с помощью стандартных инструментов командной строки

    Как может пользователь, не являющийся пользователем root, проверить, экспортирована ли FS на сервер?

    В чем разница между Minicom и gammu-smsd?

    Расписание работы с нерегулярными интервалами

    Что такое формат отладочных символов Linux?

    Как сообщить журналисту перечитать его конфигурацию?

    Запуск процесса с более высоким приоритетом

    Невозможно настроить службу netcfg в arch linux

    Недопустимое присвоение zsh в функции канала

    Команда PHP exec имеет результат 0, даже если возникает ошибка

    Проблемы с памятью при сжатии и передаче большого количества небольших файлов (всего 1 ТБ)

    Linux и Unix - лучшая ОС в мире.