Можно ли объединять строки на основе составных уникальных значений двух столбцов

Используйте в своем пути $HOME, а не тильду (~), особенно если вы заключаете новый PATHв двойные кавычки. Тильда не расширяется, когда встречается в кавычках.

Тестирование:

$ mkdir "$HOME/t"

$ cat >"$HOME/t/foo" <

См. также:Почему тильда (~)не раскрывается внутри двойных кавычек?

0
23.03.2020, 10:54
2 ответа

С помощью GNU datamashвы можете сделать:

datamash -t'|' groupby 1,3 collapse 2 < <(tail -n+3 file)

Выход:

Category code invalid|merchanta|03077,09877
Invalid ID|merchanta|12345
Invalid ID|merchantc|07323,03523
No valid reason|merchnatb|78653

Это группирует по первому и третьему полю и сворачивает значения второго поля. tail -n+3используется для пропуска двух строк заголовка.

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

{
  head -n2 file
  datamash -t'|' groupby 1,3 collapse 2 < <(tail -n+3 file) | 
    awk 'BEGIN{OFS=FS="|"}{print $1,$3,$2}'
}

Выход:

Error Desc|RefNo|Merchant
===================================
Category code invalid|03077,09877|merchanta
Invalid ID|12345|merchanta
Invalid ID|07323,03523|merchantc
No valid reason|78653|merchnatb
0
28.04.2021, 23:19

Наверное, я что-то упускаю — возможно, это можно сделать короче — но это работает:

awk '
    BEGIN   {   FS="|"; OFS="|" }
    NR <= 2
    NR > 2  {
                seen_desc[$1]++
                seen_merc[$3]++
                if (ref[$1,$3] == "")
                        ref[$1,$3] = $2
                else
                        ref[$1,$3] = ref[$1,$3] "," $2
            }
    END     {
                for (desc in seen_desc) {
                        for (merc in seen_merc) {
                                if (ref[desc,merc] != "") {
                                        print desc, ref[desc,merc], merc
                                }
                        }
                }
            }'
0
28.04.2021, 23:19

Теги

Похожие вопросы