Есть ли простая команда для вывода столбцов с разделителями табуляции?

Например, у меня есть файл (созданный с помощью echo -e "var1\tvar2\t\var3\tvar4" > foo ), которые выводятся как:

 $ cat foo case elems meshing nlsys uniform 2350 0.076662 2.78 non-conformal 348 0.013332 0.55 scale 318 0.013333 0.44 smarter 504 0.016666 0.64 submodel 360 .009999 0.40 unstruct-quad 640 0.019999 0.80 unstruct-tri 1484 0.01 0.88 

Я бы предпочел выход вроде этого (здесь я использовал vim и :set tabstop=14 ):

  • Запустите еще одну команду перед запуском команды, которую пользователь хочет запустить.
  • grep для буквенно-цифровых строк любой длины с двоеточием с каждой стороны
  • Возьмите два столбца в файле с разделителями табуляции и объедините их в один
  • rsync в очень большой директории
  • Удаление процесса в фоновом режиме
  • Командная строка для перехода в каталог, переданный командой
  •  case elems meshing nlsys uniform 2350 0.076662 2.78 non-conformal 348 0.013332 0.55 scale 318 0.013333 0.44 smarter 504 0.016666 0.64 submodel 360 .009999 0.40 unstruct-quad 640 0.019999 0.80 unstruct-tri 1484 0.01 0.88 

    Я могу получить такую ​​же функциональность с cat если я использую $ tabs=15 в bash (см. Этот вопрос ). Есть ли программа, которая делает этот вид форматирования автоматически? Я не хочу экспериментировать с значением tabs перед тем, как вставить файл.

  • Использование вывода sed в другом скрипте или команде
  • Алиасы / функции Bash и параметры командной строки
  • Использование ключевого файла в качестве пароля с OpenSSL
  • Получить значения раздела файла
  • Как я могу надежно найти полный путь программы в PATH?
  • Объединение содержимого нескольких CSV-файлов в один файл .csv
  • 4 Solutions collect form web for “Есть ли простая команда для вывода столбцов с разделителями табуляции?”

    Обычно я использую для этого программу column , она находится в пакете bsdmainutils на Debian:

     column -t foo 

    Вывод:

     case elems meshing nlsys uniform 2350 0.076662 2.78 non-conformal 348 0.013332 0.55 scale 318 0.013333 0.44 smarter 504 0.016666 0.64 submodel 360 .009999 0.40 unstruct-quad 640 0.019999 0.80 unstruct-tri 1484 0.01 0.88 

    Выдержка из column(1) в моей системе:

     ... -t Determine the number of columns the input contains and create a table. Columns are delimited with whitespace, by default, or with the characters supplied using the -s option. Useful for pretty-printing displays. ... 

    Несколько вариантов:

     var1=uniform var2=2350 var3=0.076662 var4=2.78 printf '%-15s %-10s %-12s %s\n' \ case elems messing nlsys \ "$var1" "$var2" "$var3" "$var4" printf '%s\t%s\t%s\t%s\n' \ case elems messing nlsys \ "$var1" "$var2" "$var3" "$var4" | expand -t 15,25,37 printf '%s\t%s\t%s\t%s\n' \ case elems messing nlsys \ "$var1" "$var2" "$var3" "$var4" | column -t -s $'\t' 

    column – нестандартная команда, некоторые версии / версии не поддерживают параметр -s. Он вычисляет ширину столбца на основе ввода, но это означает, что он может начать отображение только после того, как все входные данные были отправлены на него. $'...' – синтаксис ksh93, также найденный в zsh и bash.

    С zsh:

     values=( case elems messing nlsys "$var1" "$var2" "$var3" "$var4" ) print -arC4 -- "$values[@]" 

    Вы также можете использовать rs в качестве альтернативы column -t :

     (x=$(cat);rs -c -z $(wc -l<<<"$x")<<<"$x") 

    -c изменяет разделитель входных столбцов, но -c самостоятельно устанавливает разделитель входных столбцов на вкладку. -z устанавливает ширину каждого столбца в ширину самой длинной записи столбца вместо того, чтобы сделать все столбцы одинаковой ширины. Если в некоторых строках меньше столбцов, чем в первой строке, добавьте -n .

    Вопрос заключался в том, чтобы выводить столбцы с разделителями табуляции.

    Поэтому правильный ответ – небольшая адаптация ответа @nisetama. Я добавил параметр -C $ '\ t', который устанавливает форматирование вывода.

     x=$(cat foo2); rs -C$'\t' $(wc -l <<<"$x") <<<"$x" 

    Кудо к @nisetama, хотя 🙂

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