2013-11-21 1 views
2

У меня есть файл с несколькими записями для каждого идентификационного номера. Файл имеет около 2000 идентификаторов с 54 000 наблюдений на ID. Мне нужно передать результат в алгоритм, который требует, чтобы идентификаторы были меньше 6 символов. Как я могу заменить идентификаторы с номерами от 1 до 2000? ID в файле выглядит следующим образом:Как заменить комплекс ID с номером?

2007I804567 
2007I804567 
2007I804567 
2007I804568 
2007I804568 
2007I804568 
2007I804569 
2007I804569 
2007I804569 

нужно, чтобы выглядеть следующим образом (хотите сохранить ID):

1 2007I804567 
1 2007I804567 
1 2007I804567 
2 2007I804568 
2 2007I804568 
2 2007I804568 
3 2007I804569 
3 2007I804569 
3 2007I804569 

Благодаря

+0

Вы должны отобразить уникальные идентификаторы ряда каждого (при 1,000,000), а затем кормить его алгоритма. Последним шагом будет перевод ваших номеров обратно в идентификаторы. –

+0

Я хотя об уникальной сортировке идентификаторов, а затем присваиваю номер строки. Тогда как мне вернуть эти номера строк в большой файл? –

+0

Вы сохраняете, какой идентификатор был присвоен каждому номеру, и в конце процесса обратный процесс. –

ответ

4
$ cat file 
2007I804567 
2007I804567 
2007I804567 
2007I804568 
2007I804568 
2007I804568 
2007I804569 
2007I804569 
2007I804569 
$ 
$ awk '!seen[$0]++{++id} {print id, $0}' file 
1 2007I804567 
1 2007I804567 
1 2007I804567 
2 2007I804568 
2 2007I804568 
2 2007I804568 
3 2007I804569 
3 2007I804569 
3 2007I804569 
+0

не будет ли этот мандат отсортированным вводом? – jkshah

+0

Удивительный, это отлично работает. У меня вопрос о том, что это делает. Является ли функция ID распознающей уникальные строки и присваивая этой строке идентификатор? Кажется, что это работает, когда у меня есть файл только с идентификаторами, иначе он просто выводит номера строк в конец файла. –

+0

@jkshah - необязательно отсортированные, но все одинаковые числа сгруппированы вместе, как показано в представленном репрезентативном примере ввода. Это тривиальная настройка для создания массива карт, если это не будет тем, чего хочет OP в конце концов. –

2

Попробуйте следующие awk

awk '!($0 in id) {id[$0]=++n} {print id[$0], $0}' file 

Краткое описание

awk ' 
    !($0 in id) {    # if line is not present in array 'id' 
     id[$0]=++n   # assign unique ID of a line to incremental number i.e. create an array of id with line a key 
    } 
    { 
     print id[$0], $0  # print corresponding ID along with line content 
    }' file     # input file 
Смежные вопросы