根据其他 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”的新列,它确实添加了“Merged”作为列,但没有用逗号分隔它。

谢谢

答案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

我还更新了commnad,以便如果条件不满足,则column#24将为0,否则如果为真,则为1,因此所有记录将具有相同的列数;

如果您想将这些列留空而不是填充 0,则:

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

答案2

您的代码存在一些问题awk

  1. 没有定义输入字段分隔符。如果输入是一个简单的 CSV 文件(意味着没有嵌入逗号、引号或换行符的字段),那么您可能需要将变量设置FS为逗号(例如通过-F ,在命令行上使用)。如果不设置FS,awk将使用任何连续的空白字符作为输入字段分隔符。

  2. 没有定义输出字段分隔符。一旦修改或添加字段,就会输出整条记录,并以 的值OFS作为字段分隔符。默认情况下,这是一个空格,但在本例中它可能应该是逗号字符。

  3. 您描述的逻辑与您实现的逻辑不同。您说字段 22 和 23 应该是特定值,但您实现了或者

反而:

awk -F , '
    BEGIN { OFS = FS }
    NR == 1 { $24 = "Merge" }
    $22 == "Malicious" && $23 == "C&C-FileDownload" { $24 = 1 }
    NF != 24 { $24 = "" } # add empty field at end to make 24 fields
    { print }' file

如果您的数据是嵌入逗号、引号和换行符的 CSV 文件,那么您可能应该使用支持 CSV 的工具至少对数据进行初始解析及其最终输出,以表示所有数据字段正确。

相关内容