在awk脚本中使用shell命令,该脚本必须访问awk命令

时间:2016-06-09 22:56:35

标签: bash shell awk

这本质上是我想要的命令,所有这些都有效,除了我想在我的第三列中打印一些特殊的东西,这些东西会使用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

感谢您!

1 个答案:

答案 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 相同的行上。