Используйте хеш-карту для сбора всех уникальных файлов. Хэш зависит от содержимого, поэтому только файлы с уникальным содержимым получают запись в хеш-карте.
declare -A unique_files
for file in *; do
unique_files["$(md5sum "$file" | cut -d ' ' -f 1)"]="$file"
done
echo "${unique_files[@]}"
pr
делает многое из того, что делает column
. Если вы укажете фактическую командную строку, мы можем работать над заменой.
NAME pr - convert text files for printing
SYNOPSIS pr [OPTION]... [FILE]...
DESCRIPTION Paginate or columnate FILE(s) for printing.
Для вашего конкретного случая вы можете использоватьawk
:
awk '{printf("%2s %30s %10s", $1, $2, $3);}' file.txt
Обратите внимание, что спецификаторы ширины 2, 30 и 10 жестко закодированы, вы должны выбрать значения для ввода или прочитать файл дважды (один раз, чтобы получить максимальную ширину для каждого столбца, и второй раз, чтобы напечатать его. с полученными значениями ).
Насколько мне известно, прямого эквивалента column
среди набора утилит POSIX нет.
Возможным (дешевым )решением POSIX может быть:
$ tr -s ' ' '\n' <<"EOT" | pr -3 -a -t
1 SMALL 000a
2 VERY_VERY_VERY_VERY_LONG 000b
3 SMALL 000c
EOT
1 SMALL 000a
2 VERY_VERY_VERY_VERY_LON 000b
3 SMALL 000
После копирования/вставки поля ваших образцов данных были разделены пробелами. В случае, если они действительно разделены одним TAB
, вы можете использовать tr '\t' '\n'
.
Конечно, это предполагает, что все входные строки имеют одинаковое количество полей. Довольно очевидным недостатком является то, что столбцы имеют одинаковый размер, из-за чего они выглядят значительно хуже, чем вывод column -t
.
Кроме того, как показано в приведенном выше примере, pr
использует фиксированную длину для строк (, по умолчанию 72 символа ), и обрезает поля, которые не помещаются в ширину их столбца. Затем может потребоваться явная установка ширины страницы(-w
)на подходящее значение.
POSIX предпочитает систематизировать существующее поведение и предписывать новые функции или функции, которые не получили широкого распространения, только если существующее поведение неудовлетворительно. В настоящее время не так много требований к представлению данных с использованием неформатированного текста в шрифтах с фиксированной шириной -, так что column
вряд ли станет обязательным. В отличие от pr
, это из BSD, в нем нет System V и других исторических унифицированных систем, поэтому он не унаследован.
Как и любую другую текстовую утилиту, вы можете выразить ее в awk с умеренным объемом работы. Вот минимально протестированная реализация column -t
. Параметр Awk -v
похож на column
-s
в простых случаях (с одним символом ).
#!/usr/bin/env awk
{
if (max_column < NF) max_column = NF;
for (i = 1; i <= NF; i++) {
if (width[i] < length($i)) width[i] = length($i);
data[NR, i] = $i;
}
}
END {
for (i = 1; i < max_column; i++) format[i] = sprintf("%%-%ds ", width[i]);
format[max_column] = "%s\n";
for (k = 1; k <= NR; k++) {
for (i = 1; i <= max_column; i++) printf format[i], data[k, i];
}
}