这本质上是我想要的命令,所有这些都有效,除了我想在我的第三列中打印一些特殊的东西,这些东西会使用shell命令(或者我想的更多awk命令但是我不知道我怎么适合这进入了原始的awk声明)。我需要帮助的是在打印语句中$ 2和ar [$ 4,$ 1]之间的伪命令替换,但为了特殊性而留下其余部分。
awk 'NR==FNR{ar[$3,$2]=$1+ar[$3,$2]; }
NR>FNR && ar[$4,$1] {print "hs"$1,$2,`awk '$1 == #$1 from outer awk command# file2 | tail -n 1 | awk '{print $3}'`, ar[$4,$1]}' file1 file2
file1看起来像
5 8 t11
15 7 t12
3 7 t14
file2看起来像
8 4520 5560 t11
8 5560 6610 t12
8 6610 7400 t13
7 9350 10610 t11
7 10610 11770 t12
7 11770 14627 t13
7 14627 16789 t14
输出应该看起来像
8 4520 7400 5
7 10610 16789 15
7 14647 16789 3
感谢您!
答案 0 :(得分:2)
非 awk ,低效的shell工具代码:
while read a b c ; do \
echo -n "$b " ; \
egrep "^$b " file2 | \
grep -A 9999999 " $c" | \
cut -d' ' -f2,3 | \
sed '1{s/ .*//;t}
${s/.* //;t};d' | \
xargs echo -n ; \
echo " $a" ; \
done < file1 | \
column -t
输出:
8 4520 7400 5
7 10610 16789 15
主循环输入 file1 ,它控制 file2 中需要打印的内容。 file1 包含 3 字段,因此read
需要3个变量: $ a , $ b ,以及的 $ C 即可。输出使用 $ b 和 $ a ,因此这两个变量“免费” - 主循环的第一行和最后一行({{1} } s ),前缀 $ b 和后缀 $ a 到每行中间的两个数字。
echo
打印 file2 中以 $ b 开头的每个行的,但在这些行中我们只想要一个那个以 $ c 结尾加上之后的行,这就是egrep
打印的内容。只需要中间两列,因此grep -A ...
仅打印这些列。现在我们有一个两列数字块,我们只想要cut
代码打印的左上角或右下角......
任何sed
代码会在运行时自动计算行数。当sed
点击第一个行时,它会运行第一组花括号中的内容,(sed
代码'1{<
)。如果失败>}'
检查它是 last 行,(sed
表示最后一行),如果 ,则$
运行第二组花括号中的内容是什么(sed
代码'${<
)。如果不是第一行或最后一行>}'
删除它。
在大括号内:sed
就像s/ .*//
一样。结束cut -f 1
表示'GOTO标签',但是当没有'标签't
时,只需启动一个新周期,读取另一行 - 没有sed
,代码将运行t
1}},并且什么都不打印。对于两个字段,d
的作用类似于s/.* //
等。
主cut -f 2
循环while
的每次传递打印两个数字,但每个都在它自己的行上。将sed
添加到xargs echo -n
并将两个数字放在与 $ b 相同的行上。