2015-12-06 175 views
1

我有一些文件,如下所示。我想根据$ 1提取$ 5的价值。基于另一列从列中提取数据

文件1

sam  60.2 143 40.4 19.8 
mathew 107.9 144 35.6 72.3 
baby 48.1 145 17.8 30.3 
rehna 47.2 146 21.2 26.0 
sam  69.9 147 .0  69.9 

文件2

baby 58.9 503 47.5 11.4 
daisy 20.8 504 20.4 .4 
arch 61.1 505 12.3 48.8 
sam  106.6 506 101.6 5.0 
rehna 73.5 507 35.9 37.6 
sam  92.0 508 61.1 30.9 

我用下面的代码来提取$ 5。

awk '$1 == "rehna" { print $5 }' * 
awk '$1 == "sam" { print $5 }' * 

我想获得输出如下图所示

rehna sam 
26.0 19.8 
37.6 69.9 
     5.0 
     30.9 

如何实现这一目标?您的建议将不胜感激!

回答

1

最简单的可能是paste在一起的结果:

#!/bin/bash 

function myawk { 
    awk -v name="$1" 'BEGIN {print name} $1 == name { print $5 }' file1 file2 
} 

paste <(myawk rehna) <(myawk sam) 

运行此产生你所要求的结果(TAB作为分隔符)。有关其他选项,请参阅paste文档。

0

更新peak's answer以来包裹在一个函数这种方法,在DRY精神。如果你想要更多的背景信息,请继续阅读。

假设击,ksh或岩组作为壳:

printf '%s\t%s\n' 'rehna' 'sam' 
paste \ 
    <(awk '$1 == "rehna" { print $5 }' *) \ 
    <(awk '$1 == "sam" { print $5 }' *) 

上面产生标签 - 分隔输出。

paste is a POSIX utility输出对应的行来自其输入文件,默认情况下用制表符分隔;例如,paste fileA fileB收率:

<line 1 from fileA>\t<line 1 from fileB> 
<line 2 from fileA>\t<line 2 from fileB> 
... 

如果任何输入文件用完线,其提供空行。

在这种情况下,使用process substitution<(...))将awk命令的各个输出用作输入文件。

相关问题