そのフィールドが別のファイルにある場合は、行の削除

そのフィールドが別のファイルにある場合は、行の削除

カンマで区切られた2つのcsvファイル(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)を取得し、ファイルの4番目の列(section_fru_out.csv)からその値(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}section_ne_lookup.csv: これが最初のファイルではなく、start with の 2 番目のフィールドに関連付けられた行の 4 番目または 5 番目のフィールドが行でない場合、そのDummy行を印刷します。

関連情報