У меня есть 10 полей данных, которые содержат избыточные и неизбыточные данные. Я хочу использовать grep / sed / awk / uniq / something, чтобы создать неизбыточный список.

В частности, я хочу удалить записи, которые имеют идентичные записи в полях 4, 6, 7 и 8. Однако мне нужно зарезервировать одну (первую) из этих записей.

Вот и пример ввода

1, 3972361, 4u5p_1, blb, А, 47, 50, ПКЭТ, 1.78, 3

1, 3972365, 4u5p_1, al3, A, 91, 94, APFI, 1.78, 6

1, 3972372, 4u5p_1, blb, B, 47, 50, ПКЭТ, 1.78, 3

1, 3972376, 4u5p_1, al3, B, 91, 94, APFI, 1.78, 6

1, 3972387, 4u5p_1, al3, C, 91, 94, APFI, 1.78, 6

2, 3972361, 4u5p_1, blb, А, 47, 50, ПКЭТ, 1.78, 4

2, 3972365, 4u5p_1, al3, A, 91, 94, APFI, 1.78, 6

2, 3972372, 4u5p_1, blb, B, 47, 50, ПКЭТ, 1.78, 4

2, 3972376, 4u5p_1, al3, B, 91, 94, APFI, 1.78, 6

2, 3972387, 4u5p_1, al3, C, 91, 94, APFI, 1.78, 6

Вот пример вывода

1, 3972361, 4u5p_1, blb, А, 47, 50, ПКЭТ, 1.78, 3

1, 3972365,4u5p_1, al3, A, 91, 94, APFI, 1.78, 6

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

Огромное спасибо!

2
jspudross 17 Окт 2016 в 13:26

3 ответа

Лучший ответ

Вы также можете использовать awk и увидеть, как показано ниже;

awk '!seen[$4$6$7$8]++' yourFile

Или

awk -F , '!seen[$4$6$7$8]++' file1

Например;

user@host $ awk '!seen[$4$6$7$8]++' file1
1, 3972361, 4u5p_1, blb, A, 47, 50, PKET, 1.78, 3
1, 3972365, 4u5p_1, al3, A, 91, 94, APFI, 1.78, 6
1
Mustafa DOGRU 17 Окт 2016 в 11:09

С sort:

$ sort -u -t, -k4,4 -k6,6 -k7,7 -k8,8 file
1, 3972365, 4u5p_1, al3, A, 91, 94, APFI, 1.78, 6
1, 3972361, 4u5p_1, blb, A, 47, 50, PKET, 1.78, 3

Или, как предлагает @potong в комментарии, короче:

sort -ut, -k4,4 -k6,8 file
2
SLePort 17 Окт 2016 в 14:27

Делать:

awk -F "[ ,]+" '!a[$4$6$7$8]{a[$4$6$7$8]=$0} END{for (i in a) print a[i]}' file
  • !a[$4$6$7$8] проверяет, не содержит ли массив a ключ, состоящий из требуемых полей для проверки

  • Если ключ не существует, запускается {a[$4$6$7$8]=$0}, т.е. создается элемент массива с желаемыми полями в качестве ключа и всей записью в качестве значения

  • Наконец, END{for (i in a) print a[i]} печатает значения массива a

Пример:

% cat file.txt
1, 3972361, 4u5p_1, blb, A, 47, 50, PKET, 1.78, 3
1, 3972365, 4u5p_1, al3, A, 91, 94, APFI, 1.78, 6
1, 3972372, 4u5p_1, blb, B, 47, 50, PKET, 1.78, 3
1, 3972376, 4u5p_1, al3, B, 91, 94, APFI, 1.78, 6
1, 3972387, 4u5p_1, al3, C, 91, 94, APFI, 1.78, 6
2, 3972361, 4u5p_1, blb, A, 47, 50, PKET, 1.78, 4
2, 3972365, 4u5p_1, al3, A, 91, 94, APFI, 1.78, 6
2, 3972372, 4u5p_1, blb, B, 47, 50, PKET, 1.78, 4
2, 3972376, 4u5p_1, al3, B, 91, 94, APFI, 1.78, 6
2, 3972387, 4u5p_1, al3, C, 91, 94, APFI, 1.78, 6

% awk -F "[ ,]+" '!a[$4$6$7$8]{a[$4$6$7$8]=$0} END{for (i in a) print a[i]}' file.txt
1, 3972365, 4u5p_1, al3, A, 91, 94, APFI, 1.78, 6
1, 3972361, 4u5p_1, blb, A, 47, 50, PKET, 1.78, 3
2
heemayl 17 Окт 2016 в 10:36