我有一些文件如下所示。我想基于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
我如何实现这一目标?您的建议将不胜感激!
答案 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 substitution(awk
)将<(...)
命令的相应输出用作输入文件。