Команда оболочки, которая заменяет коды событий в соответствии со словарем - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть файл (silly_log.txt), в котором события кодируются числовыми значениями, и я хотел бы расширить эти коды до формы, которую люди могут легче читать.Информация, необходимая для этого, находится в другом файле (dictionary.txt).Моя ситуация выглядит примерно так:

silly_log.txt (пример):

0
1
5
0
1
7
1
5
0

dictionary.txt (пример):

0:idle
1:receiving data
5:processing data
7:parity error

желаемый вывод:

0:idle
1:receiving data
5:processing data
0:idle
1:receiving data
7:parity error
1:receiving data
5:processing data
0:idle

Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Использование Perl:

/tmp> cat dictionary.txt
0:idle
1:receiving data
5:processing data
7:parity error
/tmp> cat silly.log
0
1
5
0
1
7
1
5
0
/tmp> perl -F: -lane ' $kv{$F[0]}=$F[1] if $ARGV eq "dictionary.txt"; print "$F[0]:$kv{$F[0]} " if $ARGV eq "silly.log" ' dictionary.txt silly.log
0:idle
1:receiving data
5:processing data
0:idle
1:receiving data
7:parity error
1:receiving data
5:processing data
0:idle
/tmp>
0 голосов
/ 11 декабря 2018

С помощью awk вы можете сказать:

awk -F':' 'FNR==NR {a[$1]=$2; next} {print $1":"a[$1]}' dictionary.txt silly_log.txt

, который выводит:

0:idle
1:receiving data
5:processing data
0:idle
1:receiving data
7:parity error
1:receiving data
5:processing data
0:idle
  • -F':' устанавливает разделитель полей на ':'.
  • FNR==NR соответствует, если и только если первый файл аргумента dictionary.txt прочитан, то он создает карту.
  • Фрагмент {print ..} выполняется, пока читается второй файл аргумента, затем онинтерпретирует коды к текстам на основе карты.

РЕДАКТИРОВАТЬ
В качестве альтернативы, вы также можете просто сказать с помощью bash:

declare -a a

while IFS=: read -r code str; do
    a["$code"]="$str"
done < "dictionary.txt"

while read -r code; do
    printf "%d:%s\n" "$code" "${a[$code]}"
done < "silly_log.txt"
...