AWK можно ли прочитать поле времени и использовать его для сортировки?

У меня есть два файла, и мне нужно отсортировать и объединить строки на основе столбца времени:

Файл А:

"2014-02-26 16:03:04"   "Login Success|isNoSession=false"   id=csr,ou=user,dc=openam,dc=forgerock,dc=org    7efb2f0e035a0e3d01  10.17.174.30    INFO    dc=openam,dc=forgerock,dc=org   "cn=dsameuser,ou=DSAME Users,dc=openam,dc=forgerock,dc=org" AUTHENTICATION-100  DataStore   "Not Available" 10.17.174.30

Файл Б:

"2014-02-26 16:02:27"   "Login Failed"  dennis  "Not Available" 10.17.174.30    INFO    dc=openam,dc=forgerock,dc=org   "cn=dsameuser,ou=DSAME Users,dc=openam,dc=forgerock,dc=org" AUTHENTICATION-200  DataStore   "Not Available" 10.17.174.30    
"2014-02-26 16:02:37"   "Login Failed"  purva   "Not Available" 10.17.174.30    INFO    dc=openam,dc=forgerock,dc=org   "cn=dsameuser,ou=DSAME Users,dc=openam,dc=forgerock,dc=org" AUTHENTICATION-200  DataStore   "Not Available" 10.17.174.30

Мне нужно объединить файлы (довольно стандартно), но я должен вставить строки в окончательный файл на основе времени, указанного в столбце 1. У меня есть несколько других элементов, которые нужно изменить для каждой строки, но я уверен, что смогу это понять. Сортировка по столбцу времени поставила меня в тупик.

Так что в этом случае у меня будет файл со строкой из файла A в конце.

Другие детали.

Просто чтобы освежиться в gawk, я работал над разбором первого файла. Вот что у меня есть до сих пор:

#!/bin/awk -f
BEGIN {
    FS="\t";
}
{
    # if we have more than 12 fields for the current row, proceed
    if ( NF > 12 )
    {
        # start looking for the user name
        n = split( $3, var1, ",");
        if (n > 4)
        {
            n2 = split (var1[1], var2, "=");
            if (n2 >= 2)
            {
                # Ignore any line where we do not have "id=xxxxx,..."
                if (var2[1] == "id")
                {
                    print $1, "N/A", "N/A", $12, $5, $5, var2[2]
                }
            }
        }
    }
}
END {
    print "Total Number of records=" NR
}

Мне, вероятно, нужно переместить это в функцию, чтобы упростить ее, поскольку я собираюсь обрабатывать два файла одновременно.


person D-Klotz    schedule 26.02.2014    source источник
comment
Если вы просто соедините два файла, а затем отсортируете объединенный файл по полю даты/времени, используя систему sort, получите ли вы нужный результат? Я отмечаю, что формат даты/времени таков, что его можно отсортировать по алфавиту, чтобы даты и время были в хронологическом порядке.   -  person Simon    schedule 27.02.2014
comment
Сортировка должна основываться на фактическом времени, а не на сортировке символов. Есть лучший способ сказать это, я надеюсь, вы поняли, что я имею в виду.   -  person D-Klotz    schedule 27.02.2014
comment
@ D-Klotz: наш вопрос: чем в этом случае сортировка символов отличается от сортировки «фактического времени»? потому что в этом формате даты/времени они являются одним и тем же ИМО.   -  person Wrikken    schedule 27.02.2014
comment
@ D-Klotz: Мне кажется, что способ форматирования даты и времени для этого случая, сортировка по символам и сортировка по времени дадут точно такой же результат. Если есть примеры, где они давали бы другой результат, не могли бы вы их показать?   -  person Simon    schedule 27.02.2014
comment
я думаю ты прав   -  person D-Klotz    schedule 27.02.2014


Ответы (2)


Основываясь на тегах linux и bash, вы можете объединить оба файла, отсортировать их по первому полю, а затем применить команду awk к результату:

cat fileA fileB | sort -t$'\t' -s -k1,1 | awk -f script.awk
person Birei    schedule 26.02.2014
comment
шазам! Это выглядит многообещающе. Я немного старый ботаник Linux, но я никогда не использовал сортировку. Можете ли вы объяснить аргументы, которые у вас есть? Спасибо - person D-Klotz; 27.02.2014
comment
Я посмотрю. я перестану лениться - person D-Klotz; 27.02.2014
comment
Я не мог найти, что означает последнее - в части сортировки. - person D-Klotz; 27.02.2014
comment
Это означает, что нужно читать ввод из канала, но он не нужен для команды sort, поэтому вы можете избавиться от него (я отредактировал, чтобы удалить его). - person Birei; 27.02.2014

person    schedule
comment
Интересно. Спасибо. Я попробую это завтра. - person D-Klotz; 27.02.2014
comment
@ D-Klotz Это будет хороший опыт обучения. Если у вас есть какие-либо вопросы, обращайтесь. Удачи! - person jaypal singh; 27.02.2014