awkを使用した3つのファイルの処理

awkを使用した3つのファイルの処理

次のファイルを検討してください。

file1:

boo,8,1024
foo,7,2048

file2:

foo,0,24,154
noo,0,10,561

file3:

24,154,7,1024,0

私が必要なのは行きます。ファイル1そして$2==7trueであることを確認し$1て、$2$3ファイル1;今比較する必要があります$1ファイル1$1と同じファイル2;事実なら、私は$3次のことをしなければなりません。$4ファイル2には存在しませんファイル1、それから出なければならないファイル3そして$1それが出ていることを確認してくださいファイル3$3と同じファイル2$2そしてファイル3$4と同じファイル2;そうであれば、私が送ったものであることを確認する必要があります$2ファイル1$3と同じファイル3、この条件が true の場合は$3比較する必要があります。ファイル1$4とともにファイル3$3ファイル1$4よりファイル3

次のスクリプトを試しました。

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]}}
                        }
                  }

  }'

希望の出力は次のとおりです。

foo,7,2048,24,154,1024

ベストアンサー1

これは私にとって効果的です。

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

説明する:

  • 最初の行(FNR==1{++f})はファイルインデックスを増やし、後で1〜3のファイルを決定します。
  • ファイル1:もし$2同じなら7
    • a1$1インデックス、a2インデックス$2$3値で配列を埋める
    • o変数の最初の3つのフィールドを作成する(出力)
  • ファイル2:等しい$1(file2以前に作成された) $1file1a1
    • 出力変数に$3合計を追加します。$4o
    • a3$3インデックスと値で配列を埋めます$4
  • ファイル3:場合:
    • $1file2sと同じ$3(インデックスa3
    • $2file2sと同じ$4(値a3
    • $3file1sと同じ$2(インデックスa2
    • $4file1sの下$3(値a2
  • それから:
    • 印刷された値ですo

おすすめ記事