我有一个包含 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
:
没有定义输入字段分隔符。如果输入是一个简单的 CSV 文件(意味着没有嵌入逗号、引号或换行符的字段),那么您可能需要将变量设置
FS
为逗号(例如通过-F ,
在命令行上使用)。如果不设置FS
,awk
将使用任何连续的空白字符作为输入字段分隔符。没有定义输出字段分隔符。一旦修改或添加字段,就会输出整条记录,并以 的值
OFS
作为字段分隔符。默认情况下,这是一个空格,但在本例中它可能应该是逗号字符。您描述的逻辑与您实现的逻辑不同。您说字段 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 的工具至少对数据进行初始解析及其最终输出,以表示所有数据字段正确。