行のフィールドが別のファイルに存在する場合は行を削除します

行のフィールドが別のファイルに存在する場合は行を削除します

カンマ区切りの csv ファイルが 2 つあります (section_ne_lookup.csv と section_fru_out.csv)。

    -sh-4.1$ cat section_ne_lookup.csv
CIBI_NMS_NE,,,,,,,,,,,,,,,,,,,,,,,
D,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r,s,t,u,v,w
X,NE1,1.1.1.1,,833-006355,00,Windows,,,9.4.04,301035,,,,,,,,,,,,,
X,NE2,2.2.2.2,,833-006352,00,XS-A,,,5.1,51.573,,,,,,,,,,,,,
X,80,3.3.3.3,,833-006366,00,XS-F,,,5.2,52.604,,,,,,,,,,,,,
X,83,4.4.4.4,,833-006366,00,XS-F,,,5.3,53.575,,,,,,,,,,,,,
X,85,5.5.5.5,,833-006352,00,XS-A,,,5.3,53.605,,,,,,,,,,,,,
X,87,6.6.6.6,,Dummy_EPLC60,Dummy_EPLR60,XS-A,,,5.3,53.543,,,,,,,,,,,,,

-sh-4.1$ cat section_fru_out.csv
CIBI_NMS_FRU,,,,,,,,,,,,,,,,,,,,,,,
D,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r,s,t,u,v,w,x,y
X,UNKNOWN,0,NE2,,,,NE2:klm11,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,NE2,,,,NE2:klm12,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,NE2,,,,NE2:klm13,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,NE2,,,,NE2:klm14,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,NE2,,,,NE2:klm15,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,NE2,,,,NE2:klm16,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,NE2,,,,NE2:klm2,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,NE2,,,,NE2:klm3,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,NE2,,,,NE2:klm4,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,NE2,,,,NE2:klm5,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,NE2,,,,NE2:klm6,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,NE2,,,,NE2:klm7,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,NE2,,,,NE2:klm8,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,NE2,,,,NE2:klm9,,,,UNKNOWN,,,,,,,0,,,,,,
X,abc,0,83,,,,83:klm1,,,,rty,,,,,,,0,,,,,,
X,UNKNOWN,0,80,,,,80:klm2,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,80,,,,80:klm3,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,80,,,,80:klm4,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,80,,,,80:klm5,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,80,,,,80:klm6,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,80,,,,80:klm7,,,,UNKNOWN,,,,,,,0,,,,,,
X,UNKNOWN,0,80,,,,80:klm8,,,,UNKNOWN,,,,,,,0,,,,,,
X,TBD,1,NE2,,,,NE2:klm4.asd1,,,,bnm,,,,,,,0,,,,,,0000
X,TBD,1,80,,,,80:.klm1.asd1,,,,bnm,,,,,,,0,,,,,,3132
X,abc,1,87,,,,87:ab1,,,,,,,,,,,0,,,,,,xyz-C
X,abc,0,87,,,,87:abA,,,,bnm,,,,,,,0,,,,,,xyz-A

私がやりたいことは、section_ne_lookup.csv の 5 列目または 6 列目が「Dummy_」というフレーズで始まる場合、一致する行の 2 列目の値を取得することです。そして、この取得した値 (section_ne_lookup.csv の一致する行の 2 列目) が section_fru_out.csv の 4 列目に存在するかどうかを確認します。存在する場合は、section_fru_out.csv から一致する行を削除します。存在しない場合は、section_fru_out.csv の一致する行を保持します。このルールに基づいて、次の行を削除する必要があります。

X,abc,1,87,,,,87:ab1,,,,,,,,,,,0,,,,,,xyz-C
X,abc,0,87,,,,87:abA,,,,bnm,,,,,,,0,,,,,,xyz-A

なぜなら、section_ne_lookup.csv の最後の 2 行の 5 列目と 6 列目が Dummy_ フレーズで始まっているからです。したがって、一致する行の 2 列目 (この場合は 87) を取得し、ファイル section_fru_out.csv の 4 列目でこの値 (87) を検索する必要があります。このファイルの最後の 2 行はこのルールに一致するため、これらの行を削除する必要があります。

どうやってやるの?

答え1

これで必要な処理が実行されるはずです:

awk -F, '{
            if(NR==FNR){a[$2]=$5; b[$2]=$6;}
            else if(a[$4] !~ /^Dummy/ && b[$4] !~ /^Dummy/){print}
        }' section_ne_lookup.csv section_fru_out.csv 
  • if(NR==FNR){a[$2]=$5; b[$2]=$6;}: はFNR現在の入力ファイルの行番号で、 はNRすべての入力の行番号です。 これらが等しい場合、最初のファイルを読み込んでいます。 次に、キーが 2 番目のフィールドで値がそれぞれ 5 番目と 6 番目の連想配列を作成しaますb

  • else if (a[$4] !~ /^Dummy/ && b[$4] !~ /^Dummy/){print}: これが最初のファイルではなく、 の 2 番目のフィールドに関連付けられた行の 4 番目と 5 番目のフィールドのどちらも でsection_ne_lookup.csv始まっていない場合はDummy、その行を印刷します。

関連情報