AWK - 最大变量?

时间:2018-04-18 16:54:15

标签: awk

为什么第一个陈述有效但第二个有效?我试图添加另外两个(显示一个)变量来进行另一个比较,但第二个实例出错了。

第一个实例

awk 'f1=substr($1,0,9), f2=substr($3,0,9){if(f1==f2)print $1,$2,$3,$4}' file

第二个实例

awk 'f1=substr($1,0,9), f2=substr($3,0,9), f3=substr($1,5,3){if(f1==f2)print $1,$2,$3,$4}' file

awk: cmd. line:1: f1=substr($1,0,9), f2=substr($3,0,9), f3=substr($1,5,3){if(f1==f2)print $1,$2,$3,$4,16}
awk: cmd. line:1:                                     ^ syntax error

文件

TULSHDRJ02 ae0.0 KSCYBBRJ01 ae1.0
MTC3BBRJ02 ae4.0 KSCYBBRJ01 ae6.0
KSCYBBRJ01 ae2.0 KSCYBBRJ02 ae2.0
MTC1BBRJ02 ae4.0 KSCYBBRJ02 ae6.0

输出

KSCYBBRJ01 ae2.0 KSCYBBRJ02 ae2.0

2 个答案:

答案 0 :(得分:2)

$ awk 'substr($1,1,9)==substr($3,1,9){print $1,$2,$3,$4}' file

因为您要打印所有内容,您可以删除操作部分

$ awk 'substr($1,1,9)==substr($3,1,9)' file

或, DRY

$ awk 'function s(v) {return substr(v,1,9)} 
       s($1)==s($3)' file

答案 1 :(得分:1)

awk程序的一般程序结构如下:

condition { action [; action [ ; ... ]] }

多个动作分开;或换行。

条件和操作块都是可选的。省略条件时

{ action [; action [ ; ... ]] }

...将始终执行操作。如果省略操作:

condition

...默认操作为print

这些块中的多个可以连续放置:

cond1 { action1 } cond2 {action2} ...

注意:换行符可以始终用作分隔符(对于多行程序)

我想你想要:

awk '{f1=substr($1,0,9);f2=substr($3,0,9)} f1==f2{print $1,$2,$3,$4}'

...或以多线形式:

awk '# Runs on every line
     {
         f1=substr($1,0,9)
         f2=substr($3,0,9)
      }

      # Runs only if condition is met
      f1==f2 {
          print $1,$2,$3,$4
      }'

但不完全!

应该是

awk '{f1=substr($1,1,9);f2=substr($3,1,9)} f1==f2{print $1,$2,$3,$4}'

而不是

awk '{f1=substr($1,0,9);f2=substr($3,0,9)} f1==f2{print $1,$2,$3,$4}'

请注意,awk中的字符串,字段和数组索引从1开始,而不是0。

请同时查看karakfa's answer,其中显示了如何简化命令。