我有一个文件(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
谢谢!
答案 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>