Команда вроде `column -t`, но агностик типа кодирования?

По сути, я ищу агностическую версию команды типа column -t в linux.

Мне нужно преобразовать файлы с разделителями в плоские, а затем записать в outfile. Конкретный разделитель изменяется (, | \ t).

Иногда, но не всегда, поля содержат текстовые символы с диакритикой. Поскольку column -t совместим только с типом кодирования UTF-8, он задыхается над этими «смешными» символами:

Я попытался использовать команды, такие как file -bi чтобы определить тип кодировки, чтобы я мог перекодировать в UTF-8, но они дают только «лучшее предположение» (которое терпит неудачу, когда диакритические знаки начинаются со строки 100 000.)

До сих пор я сталкивался с следующим:

Этот скрипт в awk преобразует разделители в столбцы с фиксированной длиной, но мне нужны переменные ширины столбцов:

 $ awk -F@ '{for(i=1;i<=NF;i++){printf "%-20s", $i};printf "\n"}' input.csv 

Этот скрипт в perl находит максимальную длину для каждого столбца и устанавливает максимальный размер каждого столбца, но мне также нужно, чтобы число столбцов было переменным:

 perl -F'\t' -lane ' BEGIN { open I, "< inputfile"; for (<I>) { chomp; @x = split /\t/; (length ($x[0]) > $f0) && ($f0 = length ($x[0]) + 1); (length ($x[1]) > $f1) && ($f1 = length ($x[1]) + 1); (length ($x[2]) > $f2) && ($f2 = length ($x[2]) + 1); } close I; } print "$F[0]" . " " x ($f0 - length ($F[0])), "$F[1]" . " " x ($f1 - length ($F[1])), "$F[2]" . " " x ($f2 - length ($F[2])); ' inputfile 

У кого-нибудь есть сценарий, который:

  • Выполняется в оболочке

  • Разве что column -t (имеет дело с различной шириной столбцов, имеет дело с разным количеством столбцов, позволяет указать ваш разделитель)

  • И является агностиком типа кодирования?

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