根据另一列从列中提取数据

时间:2015-12-06 04:00:35

标签: awk

我有一些文件如下所示。我想基于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

file2的

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

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

2 个答案:

答案 0 :(得分: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文档。

答案 1 :(得分:0)

更新peak's answer已经将此方法包含在一个函数中,本着DRY的精神。如果您想了解更多背景信息,请继续阅读。

假设Bash,Ksh或Zsh为shell:

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

以上产生 tab - 分离输出。

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 substitutionawk)将<(...)命令的相应输出用作输入文件。