我是 shell 脚本和 awk 的新手。任何人都可以建议一个更有效和优雅的解决方案来解决我在下面执行两个文件之间的 key 查找的问题吗?
两个输入文件:
文件 1 - 包含单列键字段 (server-metricname-minute):
key_column
server026-AckDelayAverage-00:01:00
server026-AckDelayMax-00:01:00
server026-AckSent-00:01:00
server026-DigEnvValidationLatestTime-00:01:00
server026-DigEnvValidationTimeAverage-00:01:00
文件 2 - 包含关键字段和其他字段数的逗号分隔
key_column,host,date,minute,metricname, metric value
server026-AckDelayAverage-00:01:00,server026,May 24 2016,00:01:00,AckDelayAverage,942
server026-AckDelayMax-00:01:00,server026,May 24 2016,00:01:00,AckDelayMax,5855
server026-AckSent-00:01:00,server026,May 24 2016,00:01:00,AckSent,49038
我的逻辑是:
Loop through file1
If key found in File2
print file1.key , file2.field3 , file2.field6 to file3
else
print file1.key + 'KEY_NOT_FOUND' text to file3
fi
所以 file3 的输出应该有一行对应 file1 中的每条记录。
下面的代码似乎有效,但有谁能提出一种更有效、更优雅的实现方法吗?
while read key ;
do
metric_found=`grep $key file2`
if [[ ! -z $metric_found ]]
then
echo ${metric_found} | awk -F "," '{print $1",$3,"$6}'
else
echo ${key},KEY_NOT_FOUND
fi
done < file1
基于示例数据的现有脚本的示例输出:
server026-AckDelayAverage-00:01:00,May 24 2016,942
server026-AckDelayMax-00:01:00,May 24 2016,5855
server026-AckSent-00:01:00,May 24 2016,49038
server026-DigEnvValidationLatestTime-23:59:00,KEY_NOT_FOUND
server026-DigEnvValidationTimeAverage-23:59:00,KEY_NOT_FOUND
谢谢..
最佳答案
试试这个:
awk 'BEGIN{FS=OFS=","}NR==FNR{a[$1]=1;b[$1]=$3;c[$1]=$6;}NR>FNR{if (a[$1]) print $1,b[$1],c[$1]; else print $1,"KEY_NOT_FOUND";}' file2 file1 > file3
关于linux - 如何使用 bash 或 awk 在文件中执行关键字段查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37488797/