Форум программистов, компьютерный форум, киберфорум
Go (Golang)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 11.09.2018
Сообщений: 8

Аналог UNIX утилиты uniq на Go

10.09.2021, 00:24. Показов 2659. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток, господа формучане! Дорогие эксперты, направьте скитальца на путь истинный, подскажите как возможно реализовать эту функцию, какие структуры данных использовать и тд, как вообще грамотно это всё реализовать. Итак, задание:
Реализовать утилиту, с помощью которой можно вывести или отфильтровать повторяющиеся строки в файле (аналог UNIX утилиты uniq). Причём повторяющиеся входные строки не должны распозноваться, если они не следуют строго друг за другом. Сама утилита имеет набор параметров, которые необходимо поддержать.
Параметры

-с - подсчитать количество встречаний строки во входных данных. Вывести это число перед строкой отделив пробелом.

-d - вывести только те строки, которые повторились во входных данных.

-u - вывести только те строки, которые не повторились во входных данных.

-f num_fields - не учитывать первые num_fields полей в строке. Полем в строке является непустой набор символов отделённый пробелом.

-s num_chars - не учитывать первые num_chars символов в строке. При использовании вместе с параметром -f учитываются первые символы после num_fields полей (не учитывая пробел-разделитель после последнего поля).

-i - не учитывать регистр букв.

Использование

uniq [-c | -d | -u] [-i] [-f num] [-s chars] [input_file [output_file]]

Все параметры опциональны. Поведения утилиты без параметров -- простой вывод уникальных строк из входных данных.

Параметры c, d, u взаимозаменяемы. Необходимо учитывать, что параллельно эти параметры не имеют никакого смысла. При передаче одного вместе с другим нужно отобразить пользователю правильное использование утилиты

Если не передан input_file, то входным потоком считать stdin

Если не передан output_file, то выходным потоком считать stdout


Это всё на Go реализовать конечно же. В общем, буду ждать ваших идей, не стесняйтесь стучатся ко мне в личку, если есть желание помочь с этим, буду очень благодарен Всем добра!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.09.2021, 00:24
Ответы с готовыми решениями:

Есть код утилиты ping. На его основе нужно создать аналог утилиты traceroute
Есть код утилиты ping. На его основе нужно создать аналог утилиты traceroute Не могу понять что к чему. Помогите пожалуйста! Вот...

Аналог утилиты nohup
Помогите найти ошибки в коде и получить необходимый вывод, задание звучит так: аналог утилиты nohup с выводом перехваченных сигналов. ...

Аналог утилиты find
Здравствуйте! Только начала изучать unix и есть некоторые трудности... как реализовать на с или с++ аналог утилиты find(поиск файлов по...

3
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
10.09.2021, 16:31
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package main
 
import (
    "fmt"
    "strings"
    "sort"
)
 
 
 
func Deduplicate(in *[]string) {
    /* Классический алгоритм удаления дубликатов 
    на отсортированных данных
    Данные изменяются in-place
    */
    
    j := 0
    
    for i := 1; i < len(*in); i++ {
        if (*in)[j] != (*in)[i] {
            j++
            (*in)[j] = (*in)[i]
            
        }
    }
    *in = (*in)[:j+1]
    return
}
 
 
// словарь для подсчета вхождений
func Counter(in []string) (out map[string]int) {
    out = make(map[string]int)
    
    for i := 0; i < len(in); i++ {
        out[in[i]] +=1
    }
    
    return
}
 
// только повторяющиеся строки
func Repeated(in []string) (out []string) {
    /* Search for repeated strings*/
    
    counter := Counter(in)
    for k, v :=range counter{
        if v > 1 {
            out = append(out, k)
       }
    }
    
    return
}
 
// только уникальные строки
func Unique(in []string) (out []string) {
    /* Search for unique strings */
    
    counter := Counter(in)
    for k, v :=range counter {
        if v == 1 {
            out = append(out, k)
        }
    }
    
    return
}
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
func main() {
    s := []string{"d", "d","a","c","x","z", "y","b", "a", "d"}
    sort.Strings(s)
    fmt.Println("sort  :",s)
   
    s = []string{"d", "d","a","c","x","z", "y","b", "a", "d"}
    sort.Strings(s)
    Deduplicate(&s)
    fmt.Println("dedup :", s)
    
    s = []string{"d", "d","a","c","x","z", "y","b", "a", "d"}
    sort.Strings(s)
    out := Repeated(s)
    fmt.Println("repeat:", out)
    
    s = []string{"d", "d","a","c","x","z", "y","b", "a", "d"}
    sort.Strings(s)
    out = Unique(s)
    fmt.Println("uniq  :",out)
}

Code
1
2
3
4
sort  : [a a b c d d d x y z]
dedup : [a b c d x y z]
repeat: [a d]
uniq  : [x y z b c]
0
0 / 0 / 0
Регистрация: 11.09.2018
Сообщений: 8
10.09.2021, 19:46  [ТС]
Garry Galler, Спасибо Вам за помощь! Буду разбираться. Хотел бы услышать ваше мнение, как по вашему, лучше учитывать все эти флаги, которые вводит пользователь. Хотя бы какой логике стоит придерживаться. Меня вводят в ступор флаги -f num_fields и -s num_chars. Уже третий день ума не приложу как их использовать, особенно вместе с флагами -c -d -u -i и тд.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
11.09.2021, 17:37
D22,
Вот накидал по-быстрому базовый скелет проги:

https://github.com/GarryGaller/uniq

Добавлено через 1 час 1 минуту
P.P.S. Изменил функциям сигнатуры с добавлением ignoreCase и добавил функцию FindPrefix.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.09.2021, 17:37
Помогаю со студенческими работами здесь

Аналог утилиты dir (C++)
Всем привет. Задание: написать аналог утилиты dir (C++) для Windows, с передачей данных по именованному каналу. Задача серверной...

Разработать аналог утилиты ‘cp’
Здравствуйте, задание: Разработать аналог утилиты ‘cp’ Заранее спасибо

Аналог утилиты cut
Доброго всем времени суток! Имею опыт программирования на c/c++/c#. Возникла необходимость написать пару скриптов на bash'е. Следующее...

Собственный аналог утилиты FLIP
Всем доброго времени суток! Вопрос у меня специфический - ни на этом ни на другом форуме пока решений не нашел. Если кто сможет помочь...

Упрощенный аналог утилиты paste
Вам необходимо реализовать упрощенный аналог утилиты paste. Эта утилита должна принимать на вход несколько файлов и выписывает очередные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru