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