bash regex: asterisk дает неоднозначные результаты поиска с помощью grep

Небольшое изменение ответа Валентина Б. :

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

2
15.11.2015, 01:01
0 ответов

Теги

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