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

Это мой файл,

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 

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 
  • Фильтрация или обтекание определенных разделов файла
  • Извлечение строк между специальными символами
  • Как заполнить конечные теги с помощью sed, awk или любой другой команды?
  • Сценарий для извлечения выбранных записей из файла bibtex
  • Как заменить слово внутри файла .DOCX с помощью командной строки Linux?
  • SED или AWK: добавьте символ в каждую строку после найденного шаблона
  • wget on Centos 7 Terminal как загрузить только текст без кода стиля сайта
  • Сопоставьте текущую строку до строки, которая не соответствует шаблону
  • Может ли grep выводить только указанные группы, которые соответствуют?
  • Как удалить строки в файле с определенной позиции до конца файла
  • Как найти строку после регулярного выражения в одной строке текста?
  • как использовать awk для вычитания с числами в большом файле
  • Interesting Posts

    Как заблокировать учетную запись пользователя до такой степени, чтобы она могла читать / писать / выполнять как можно меньше?

    Как настроить VLAN в той же подсети, что и Ethernet?

    Как получить дизайн коричного окна

    Ошибка startx при настройке X-сервера на archlinux

    Существует ли подходящий термин для физического пути, доступного через символическую ссылку?

    Повышение производительности числовых циклов в tcl

    Объединение двух файлов, по одному столбцу за раз

    Intel Edison Ubilinux как дистрибутив Я получаю FAILED Запуск расширенного управления IEEE 802.11: hostapdrmdir : Нет такого файла или каталога

    OpenSSH-Server: как я могу удаленно установить заголовок окна боковой панели клиента?

    Записи DNS NS не разрешены

    Remap CapsLock для Escape и системы управления Wide

    Вставить текст из буфера обмена непосредственно в браузер и сделать поиск Google для него

    Чтение через CSV-файл

    Как найти доменное имя сервера?

    Как добавить другой язык в систему Debian?

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