다른 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이 되도록 명령을 업데이트했습니다. 따라서 모든 레코드는 동일한 수의 열을 갖게 됩니다.

이 열을 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 인식 도구를 사용하여 모든 데이터 필드를 올바르게 표시해야 합니다.

관련 정보