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

Это мой файл,

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 

  • Как извлечь строку между двумя шаблонами с помощью sed в Linux, а второй шаблон повторяет больше строк в файле
  • Добавить столбцы в текстовый файл с заданным интервалом в Bash
  • Извлечение уникальной части текста из файла с помощью awk, sed или grep
  • Преобразование простых данных в json-файл
  • Шаблон Regex для замены нескольких значений с помощью sed
  • удалить содержимое с начала на первую пустую строку
  • Извлечь два значения из вывода команды
  • Как читать несколько строк вместо строк
  • 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 
    Linux и Unix - лучшая ОС в мире.