使用 awk 处理 3 个文件

Eng*_*ng7 9 awk text-processing gawk

考虑以下文件:

file1

boo,8,1024
foo,7,2048
Run Code Online (Sandbox Code Playgroud)

file2

foo,0,24,154
noo,0,10,561
Run Code Online (Sandbox Code Playgroud)

file3

24,154,7,1024,0
Run Code Online (Sandbox Code Playgroud)

我需要的是去File1并检查是否$2==7;如果为真,取$1,$2$3来自File1 ; 现在我必须比较$1来自File1 是否等于$1来自File2;如果为真,我必须从File1中不存在的File2$3和,然后我必须转到File3并检查from File3是否等于from File2,以及from File3等于from File2;如果是,那么我必须检查是否来自File1$4$1$3$2$4$2等于$3from File3,那么如果这个条件为真,我必须比较$3from File1$4from File3,如果$3from File1大于$4from File3

我尝试了以下脚本:

cat [file1] [file2] [file3] | 
awk -F, 
'{if(NF==3)
    {if($2==7){a[$1]=$1; b[$1]=$2; c[$1]=$3}
    }else
        {if(NF==4){if(a[$1]==$1){d[$3]=$3; e[$4]=$4}
                  }else
                        {if(NF==5){if(d[$1]==$1 && e[$2]==$2){print a[$1], b[$1], c[$1], d[$1]}}
                        }
                  }

  }'
Run Code Online (Sandbox Code Playgroud)

所需的输出是:

foo,7,2048,24,154,1024
Run Code Online (Sandbox Code Playgroud)

cha*_*aos 9

这对我有用:

awk -F, 'FNR==1{++f} \
  f==1 && $2==7 {a1[$1]++; a2[$2]=$3; o=$0} \
  f==2 && a1[$1] {o=o","$3","$4; a3[$3]=$4} \
  f==3 && a3[$1] && $2==a3[$1] && a2[$3] && $4<a2[$3] {print o}' \
file1 file2 file3
Run Code Online (Sandbox Code Playgroud)

说明

  • 第一行 ( FNR==1{++f}) 增加文件索引,以便稍后确定我们在哪个文件中 1-3。
  • 文件 1:如果$2等于7
    • a1使用$1作为索引a2$2作为索引和$3作为值填充数组
    • o用前 3 个字段写下变量(输出)
  • file2: if $1of file2equals $1of file1(以前写在a1)
    • $3和附加$4到输出变量o
    • a3$3as 索引和$4as 值填充数组。
  • 文件 3:如果:
    • $1等于 file2s $3(索引a3
    • $2等于 file2s $4(的值a3
    • $3等于 file1s $2(索引a2
    • $4低于 file1s $3(的值a2
  • 然后:
    • 打印 的值o