Используйте в своем пути $HOME
, а не тильду (~
), особенно если вы заключаете новый PATH
в двойные кавычки. Тильда не расширяется, когда встречается в кавычках.
Тестирование:
$ mkdir "$HOME/t"
$ cat >"$HOME/t/foo" <
См. также:Почему тильда (~)не раскрывается внутри двойных кавычек?
С помощью 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
Наверное, я что-то упускаю — возможно, это можно сделать короче — но это работает:
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
}
}
}
}'