Соответствует столбцу 1 в CSV, а затем проверьте, соответствует ли столбец 2 - PullRequest
0 голосов
/ 19 апреля 2020

В настоящее время у меня есть сценарий Bash, который удаляет определенную информацию из журналов доступа и записывает их в CSV в следующем формате:

    0004F2426702,75.214.224.151,16/Apr/2020
    0004F2426702,75.214.224.151,17/Apr/2020
    0004F2426702,75.214.224.151,18/Apr/2020
    0004F2426702,80.111.224.252,18/Apr/2020
    00085D19F072,75.214.224.151,16/Apr/2020
    00085D20A469,75.214.224.151,16/Apr/2020
    0018B9FFDD58,75.214.224.151,16/Apr/2020
    64167F801BF5,81.97.142.178,16/Apr/2020
    64167F801BF5,95.97.142.178,18/Apr/2020
    0004F2426702,80.111.224.252,19/Apr/2020

Но теперь я застрял!

Я хочу сопоставить в столбце 1 (адрес MA C), а затем проверить, совпадают ли два столбца. Если нет, выведите все строки, в которых совпадает столбец 1.

Цель этого сценария - определить, изменился ли исходный IP-адрес.

1 Ответ

0 голосов
/ 20 апреля 2020

Используя мой любимый инструмент, GNU datamash, чтобы выполнить большую часть работы по группировке и подсчету данных:

$ datamash -st, -g1,2 unique 3 countunique 3 < input.csv | awk 'BEGIN {FS=OFS=","} $NF > 1 { NF--; print }'
0004F2426702,75.214.224.151,16/Apr/2020,17/Apr/2020,18/Apr/2020
0004F2426702,80.111.224.252,18/Apr/2020,19/Apr/2020

Pure awk:

$ awk 'BEGIN { FS = OFS = SUBSEP = "," }
       { if (++seen[$1,$2] == 1) dates[$1,$2] = $3; else dates[$1,$2] = dates[$1,$2] "," $3 }
       END { for (macip in seen) if (seen[macip] > 1) print macip, dates[macip] }' input.csv
0004F2426702,75.214.224.151,16/Apr/2020,17/Apr/2020,18/Apr/2020
0004F2426702,80.111.224.252,18/Apr/2020,19/Apr/2020
...