Сопоставление строки с уникальным номером? - PullRequest
3 голосов
/ 29 сентября 2010

Есть ли хороший bash one liner для сопоставления строк внутри файла с уникальным номером?

Например,

a
a
b
b
c
c

следует преобразовать в

1
1
2
2
3
3

В настоящее время я внедряю это в C ++, но было бы неплохо использовать однострочник bash.

Ответы [ 4 ]

10 голосов
/ 29 сентября 2010
awk '{if (!($0 in ids)) ids[$0] = ++i; print ids[$0]}'

Поддерживает ассоциативный массив с именем ids.Каждый раз, когда он находит новую строку, он присваивает ей монотонно увеличивающийся идентификатор ++i.

Пример:

jkugelman$ echo $'a\nb\nc\na\nb\nc' | awk '{if (!($0 in ids)) ids[$0] = ++i; print ids[$0]}'
1
2
3
1
2
3
3 голосов
/ 29 сентября 2010

Решения awk здесь хороши, но вот такой же подход в чистом bash (> = 4)

declare -A stringmap
counter=0
while read string < INPUTFILE; do
    if [[ -z ${stringmap[$string]} ]]; then
        let counter+=1
        stringmap[$string]=$counter
    fi
done
for string in "${!stringmap[@]}"; do
    printf "%d -> %s\n" "${stringmap[$string]}" "$string"
done
2 голосов
/ 30 сентября 2010

незначительная модификация без if

awk '!($0 in ids){ids[$0]=++i}{print ids[$0]}' file
2 голосов
/ 29 сентября 2010
awk 'BEGIN { num = 0; }
{
    if ($0 in seen) {
        print seen[$0];
    } else {
        seen[$0] = ++num;
        print num;
    }
}' [file]

(Не совсем одна строка, конечно.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...