linux - 如何使用 bash 或 awk 在文件中执行关键字段查找?

标签 linux shell awk

我是 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/

相关文章:

java - Eclipse - 执行命令行时发生异常,没有这样的文件或目录

linux - 来自不同目录的多个文件作为 awk 的输入

java - 使用 JSch 获取远程 bash shell,但自动完成功能不起作用

linux - AWK 计数 - 奇怪的行为

awk - 从一行中删除多个字符串

regex - 在 for 循环中将 shell 变量传递给 awk

Linux bash 知道包含库脚本的脚本路径

linux - 远程访问 glassfish

结合静态库

python - 将答案传递给 popen.subprocess