2015-12-06 120 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命令的各個輸出用作輸入文件。

相關問題