2012-04-17 2 views
1

У меня есть файл, который находится в формате:Как удалить дубликаты записей из файла с помощью оболочки

0000000540|Q1.1|margi|Q1.1|margi|Q1.1|margi 
0099940598|Q1.2|8888|Q1.3|5454|Q1.2|8888  
0000234223|Q2.10|saigon|Q3.9|tango|Q1.1|money 

Я пытаюсь удалить дубликаты, которые появляются на одной и той же линии.

Таким образом, если линия имеет

0000000540|Q1.1|margi|Q1.1|margi|Q1.1|margi 

Я хотел, чтобы это было

0000000540|Q1.1|margi 

Если линия имеет

0099940598|Q1.2|8888|Q1.3|5454|Q1.2|8888 

Я хотел, чтобы это было как

0099940598|Q1.2|8888|Q1.3|5454 

Я хотел бы сделать это на скрипте оболочки, который принимает входной файл и выводит файл без дубликатов.

Заранее спасибо всем, кто может помочь

+1

какая оболочка и какая версия? –

+3

Кажется, существуют пары Qx | val. Всегда ли пары совпадают? Вы хотите сохранить порядок, или '0099940598 | 8888 | 5454 | Q1.3 | Q1.2 |' будет приемлемым? Я так не думаю. Может ли '0 | Q1 | 4 | Q1 | 5' произойти? –

ответ

1

Это должно сделать это, но не может быть эффективным для больших файлов.

awk ' 
    { 
     delete p; 
     n = split($0, a, "|"); 

     printf("%s", a[1]); 

     for (i = 2; i <= n ; i++) 
     { 
       if (!(a[i] in p)) 
       { 
        printf("|%s", a[i]); 
        p[a[i]] = ""; 
       } 
     } 

     printf "\n"; 
    } 
' YourFileName 
+0

Спасибо. Файл не такой большой, около 100 тыс. Строк. Скрипт очень помог. – user1339980

Смежные вопросы