идентифицировать дублированные значения в столбце - PullRequest
0 голосов
/ 18 марта 2020

В качестве попытки упростить мой предыдущий вопрос , представьте, что у меня есть файл .csv с 2 столбцами (cul1 и cul2):

echo "cul1,cul2" > myFile.csv

Содержимое myFile.csv сначала:

cul1, cul2
Alice, 
Bob,  
John,  
Alice,
Bob,
Alex, 

возможно ли вставить значение c, например, «100», во второй столбец дублированных значений cul1? Как то так:

cul1, cul2
Alice, 100
Bob, 200 
John,  
Alice, 100
Bob, 200
Alex, 

1 Ответ

1 голос
/ 18 марта 2020

Вы можете делать все, что вам нужно, читая строки в пару массивов с awk, а затем циклически перебирая сохраненные строки в правиле END и назначая значение суффикса для каждого элемента массива, который появляется более одного раза (увеличение значение суффикса 100 каждый раз)

В секции нормальных правил требуются два массива: массив order[], в котором хранится порядок строк, поэтому они могут выводиться в одном и том же порядке (awk массивы являются ассоциативными), а затем массив seen[], который ведет подсчет количества раз, когда первый текст столбца просматривается. В разделе END вы присваиваете суффикс массиву, индексированному по значениям, видимым более одного раза, чтобы вы могли выводить, например, 100 для каждого раза, когда просматривается "Alice," и 200 для "Bob,", et c ...

Сценарий awk будет выглядеть следующим образом:

awk '{ order[++n] = NF>1 ? $0 : $1; seen[$1]++ }
END {
    sfx=100
    for (i=1;i<=n;i++)
        if (seen[order[i]] > 1) {
            order[i] in val || val[order[i]]=sfx
            print order[i]" "val[order[i]]+0
            sfx+=100
        }
        else
            print order[i]
}' file

Пример использования / Вывод

Вы можете просто скопировать и переместить -mouse-вставить скрипт в xterm в каталог, содержащий ваш входной файл. При вводе выше в file вы получите:

$ awk '{ order[++n] = NF>1 ? $0 : $1; seen[$1]++ }
> END {
>     sfx=100
>     for (i=1;i<=n;i++)
>         if (seen[order[i]] > 1) {
>             order[i] in val || val[order[i]]=sfx
>             print order[i]" "val[order[i]]+0
>             sfx+=100
>         }
>         else
>             print order[i]
> }' file
cul1, cul2
Alice, 100
Bob, 200
John,
Alice, 100
Bob, 200
Alex,

, который обеспечивает запрошенный вывод. Посмотрите вещи и дайте мне знать, если у вас есть вопросы.

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