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

时间:2018-12-10 22:34:52

标签: linux shell sed grep cut

我有一个文件(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 :(得分:3)

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

答案 1 :(得分:0)

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