Небольшое изменение ответа Валентина Б. :
awk -F"|" '
{
key = $1 "|" $2
a[key] = 1
b[key][$3] = $3 "|" $4 "|" $5 "|" $6
}
END {
subtype[1] = "DLT"
subtype[2] = "STG"
subtype[3] = "MAIN"
subtype[4] = "UNLD"
for (key in a)
{
output = key
for (i = 1; i <= 4; i++)
{
st = subtype[i]
if (b[key][st] == "")
output = output "||||"
else
output = output "|" b[key][st]
}
print output
}
}' file.dat
Как в Валентин Ответ Б. :
-F "|"
устанавливает разделитель полей на |
,
, чтобы мы могли извлекать поля из входных строк. ключ
получает значение A | 1
, A | 2
или B | 1
(или, в общем, , объединение первых двух полей).
Мы используем это, чтобы объединить данные из (до) четырех строк
, которые относятся к этой комбинации клавиш. a [key]
значение 1, чтобы записывать, какие данные (ключи) мы видели. b [ключ] [$ 3]
на оставшуюся часть строки после ключа.
Например, b ["A | 1"] ["DLT"]
будет установлен на "DLT | 07: 30 | 10: 30 | 34"
.
Таким образом, мы сохраняем запись всех данных, которые мы видели
(при условии, что в строках не более шести полей,
как указано в вопрос).
Обратите внимание, что мы делаем это, не зная, что может быть в $ 3
. После того, как мы прочитали все данные:
$ 3
значений, которыми являются «DLT», «STG», « MAIN »и« UNLD »)
, поэтому нам не нужно перечислять их более одного раза. Передайте это в sort
, если хотите, чтобы вывод был отсортирован.
(Я говорю «если», потому что
, хотя вопрос показывает отсортированный пример вывода,
он не говорит, что вывод должен быть отсортирован. )
Вопрос о том, что будет во втором поле, неточный; он говорит только, что это «числа». Если они могут быть целыми числами с разным количеством цифр, и вы хотите, чтобы они были отсортированы как числа, используйте
sort -t"|" -k1,1 -k2,2n