为什么第一个陈述有效但第二个有效?我试图添加另外两个(显示一个)变量来进行另一个比较,但第二个实例出错了。
第一个实例
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
答案 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,其中显示了如何简化命令。