Конвейер вашего входного файла в следующий должен сделать это:
cut -f1 -d, | sort | uniq -cd
Вывод отличается от того, что вы опубликовали; количество дубликатов - это первый столбец, а не последний и заключенный в скобки:
2 110110
2 112112112
Вызов cut
запрашивает выделение первого поля, разделенного запятой -, sort
гарантирует, что одинаковые поля будут следовать друг за другом, что требуется для uniq
для их группировки; -c
запрашивает подсчет, а -d
показывает только дубликаты. Сортировка всего ввода может быть не самым эффективным способом достижения того, что вы просите, но это должно быть проблемой, только если ваш ввод становится очень большим.
Для этого вам не нужны никакие внешние утилиты, а просто используйте внутреннюю часть вашей собственной оболочки с printf()
функциональностью. Например,. в оболочке bash
вы можете сделать
foo() {
if [ "$1" -lt 2 ]; then
printf '%s\n' 'insufficient arguments provided' >&2
fi
local iter
for (( iter = 1; iter <= $1; iter++ )); do
printf '%s\n' "$2"
done
}
Убедитесь, что слово, которое будет напечатано, заключено в кавычки, чтобы слова не разделялись. Например.
foo 3 bar
foo 3 'howdy world'
Если вы ищете внешнюю утилиту для того же самого, perl
или awk
могут просто сделать это по мере необходимости
printf '%s\n' 'howdy world' | perl -ne 'print $_ x 3'
или
printf '%s\n' 'howdy world' | awk '{ for (i = 1; i <= 3; i++) print $0 }'
Также в системах BSD есть двоичный файл jot
, который может просто повторять предоставленные ему строки. Или в системах Ubuntu в пакете athena-jot
.
jot -b 'howdy world' 3
tcsh
и zsh
имеютrepeat
:
repeat 3 echo word
С помощью printf
можно сделать:
printf 'word\n%.0s' {1..3}