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

Это мой файл,

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 

  • Катить все файлы в папке, включая имя файла, используя цикл for?
  • Шаблон Regex для замены нескольких значений с помощью sed
  • Удалить комментарии в файле C
  • Использование sed для цветного вывода из команды на Solaris
  • Найти последнее появление строки в нескольких файлах
  • присоединяйте два файла на основе столбца, когда в сценарии bash нет взаимно однозначного соответствия (awk, grep, sed)
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Сценарий для извлечения выбранных записей из файла bibtex
  • 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 - лучшая ОС в мире.