Найти дубликаты строк на основе некоторых разделенных полей на линии - PullRequest
2 голосов
/ 26 мая 2010

У меня есть файл со строками, в которых есть несколько полей, разделенных "|".

Я должен извлечь строки, которые идентичны на основе некоторых полей (то есть найти строки, которые содержат одинаковые значения для полей 1, 2, 3, 12 и 13) Содержимое других полей не имеет значения для поиска, но все извлеченные строки должны быть завершены.

Может кто-нибудь сказать мне, как я могу сделать это в сценариях KSH (Например, сценарий с некоторыми аргументами (в зависимости от порядка), которые определяют разделитель файлов и поля, которые необходимо сравнить, чтобы найти дубликаты строк во входном файле)

Заранее спасибо и всего наилучшего

Oli

Ответы [ 2 ]

2 голосов
/ 26 мая 2010

Это печатает дубликаты строк на основе совпадающих полей. Он использует ассоциативный массив, который может увеличиваться в зависимости от характера вашего входного файла. Вывод не сортируется, поэтому большинство дубликатов не группируются вместе (кроме первых двух из набора).

awk -F'|' '{ idx=$1$2$3$12$13; if (array[idx] == 1) {print} else if (array[idx]) {print array[idx]; print; array[idx]=1} else {array[idx]=$0}}' inputfile.txt

Возможно, вы могли бы построить свой индексный список в переменной оболочки в скрипте-обёртке примерно так:

#!/bin/ksh
for arg
do
    case arg in    # validate input (could be better)
        +([0-9]) ) # integers only
            idx="$idx'$'$arg"
            ;;
        * )
            echo "Invalid field specifier"
            exit
            ;;
    esac
done
awk -F'|' '{ idx='$idx'; if (array ...

Вы можете отсортировать вывод, отправив его по команде, например:

awk ... | sort  --field-separator='|' --key=1,1 --key=2,2 --key=3,3 --key=12,12 --key=13,13
0 голосов
/ 29 мая 2010

Это печатает строки, которые дублируются - только одна строка каждая:

awk -F'|' '!arr[$1$2$3$12$13]++' inputfile > outputfile
...