Shell 根据字典替换事件代码的命令

Shell command that replaces event codes according to a dictionary

我有一个文件 (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

谢谢!

用awk,你可以说:

awk -F':' 'FNR==NR {a[]=; next} {print ":"a[]}' 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"

使用 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>