他の2列の値に基づいてCSVファイルに新しい列を作成します。

他の2列の値に基づいてCSVファイルに新しい列を作成します。

ネットワークスキャンのデータを含む23列のCSVがあります。最後の2列(22と23)のデータに基づいて新しい列を作成する必要があります。私が望む出力は次のとおりです。

新しい列ヘッダー=表示

if column 22 = Malicious and column 23= C&C-FileDownload then new column 24= 1

Ubuntuを使ってこれを達成するのに役立つ人はいますか?私はこれを調べていて、awkが使用できるツールであることがわかりましたが、私はそれについて非常に新しいものです。

これまでこれを試しましたが、awk 'NR==1{$24="merge";print;next} \ $22 == "Malicious" || $23 == "C&C-FileDownload" {$24=1}1' Malware-44-1.csv > test1.csv「1」を持つ新しい列を追加せずに「マージ」を列として追加しますが、カンマで区切りません。

ありがとう

ベストアンサー1

入力フィールドの区切り文字が何であるかをawkに知らせる必要があります。-F,カンマ文字と言います。また、出力にフィールド区切り文字が何であるかを知らせる必要があります。-v OFS=,また、カンマ文字でなければならないことを指定します。

awk -F, -v OFS=, 'NR==1{ $24="merge"; print; next }
{ $24=($22 == "Malicious" && $23 == "C&C-FileDownload") }1
' Malware-44-1.csv > output.csv

また、条件が満たされない場合は列#24が0になり、そうでなければtrueの場合は1になるようにコマンドを更新しました。したがって、すべてのレコードには同じ数の列があります。

この列をゼロで埋めるのではなく空白のままにするには、次のようにします。

awk -F, -v OFS=, 'NR==1{ $24="merge"; print; next }
{ $24=($22 == "Malicious" && $23 == "C&C-FileDownload"?1:"") }1
' Malware-44-1.csv > output.csv

複数のルールを定義するには、次のようにします。

awk -F, -v OFS=, 'NR==1{ $24="merge"; print; next }
($22 == "Malicious" && $23 == "C&C-FileDownload") { $24=1 }
( .... ) { $24=2 }
( .... ) { $24=3 }
( .... ) { # and some more ... }
1' Malware-44-1.csv > output.csv

または、条件が満たされた場合に後続の条件処理をスキップするには、次のようにします。

awk -F, -v OFS=, 'NR==1{ $24="merge"; print; next }
($22 == "Malicious" && $23 == "C&C-FileDownload") { $24=1; print; next }
( .... ) { $24=2; print; next }
( .... ) { $24=3; print; next }
( .... ) { # and some more ... }
' Malware-44-1.csv > output.csv

または、現在のレコードを印刷してから別々に印刷することもできます。

awk 'NR==1{ print $0 ",merge" }
NR>1{ print $0 "," ($22 == "Malicious" && $23 == "C&C-FileDownload"?1:"") }
' Malware-44-1.csv > output.csv

おすすめ記事