Unix 명령을 사용하여 csv 파일 형식을 변환하는 데 도움이 필요합니다.

Unix 명령을 사용하여 csv 파일 형식을 변환하는 데 도움이 필요합니다.

입력 파일:

"Run Date/Time: 2022-02-09 12:47",,,GOOD_MORNING_WORLD
"File Processed: AB-FILE2.20220209.110516",,,GOOD_MORNING_WORLD
AB1234,5,"        PQR2",GOOD_MORNING_WORLD
AB-345,10,"        PQR2",GOOD_MORNING_WORLD
XY890,20,"        PQR2",GOOD_MORNING_WORLD

예상 출력 파일:

Codes Produced, Count, PQR, Run Date, Run Time, File Processed
AB1234,5,"PQR2",2022-02-09,12:47,AB-FILE2.20220209.110516
AB-345,10,"PQR2",2022-02-09,12:47,AB-FILE2.20220209.110516
XY890,20,"PQR2",2022-02-09,12:47,AB-FILE2.20220209.110516

위의 출력 형식을 구현하도록 도와주세요.

아래 명령을 시도했지만 열과 값을 제공합니다. 각 행에서 열 헤더를 제거해야 합니다.

awk -F, 'NR==1 {FN = $1; next} NR==2 {DT = $1; next} {print $1,$2,$3,FN,DT,$4}' OFS=, InputFile.csv > InputFile_Int.csv

AB1234,5,"        PQR2","Run Date/Time: 2022-02-09,12:47",File Processed: AB-FILE2.20220209.110516,GOOD_MORNING_WORLD
AB-345,10,"        PQR2","Run Date/Time: 2022-02-09,12:47",File Processed: AB-FILE2.20220209.110516,GOOD_MORNING_WORLD
XY890,20,"        PQR2","Run Date/Time: 2022-02-09,12:47",File Processed: AB-FILE2.20220209.110516,GOOD_MORNING_WORLD

미리 감사드립니다.

답변1

두지 마십시오 FS=.OFS= 뒤쪽에사람들이 스크립트를 읽을 때 기본 FS 및/또는 OFS 값이 있다고 가정하고 실제로 변경했다는 사실만 확인하기 때문에 코드를 읽기 어렵게 만들기 때문입니다. 대신 do awk -Fx -v OFS=y 'script' file또는 awk 'BEGIN{FS="x";OFS="y"} script' filenot 과 같이 둘 다 미리 설정하세요 awk -Fx 'script' OFS=y file. 이 규칙의 유일한 예외는 서로 다른 입력 파일에 대해 서로 다른 값으로 설정한 다음 입력 파일 이름 사이에 이러한 값 중 하나 또는 둘 다를 설정해야 하는 경우입니다.

또한 사용자 정의 변수에 모두 대문자 변수 이름을 사용하지 마십시오. 이렇게 하면 코드가 혼란스러워지고 실제로는 사용하지 않는 내장 변수 이름을 사용하는 것처럼 보이게 되어 충돌이 발생할 수 있습니다. 정의되어 있다고 생각하지만 실제로는 내장 변수 이름에 의해 깨지거나 깨지는 변수 이름입니다.

$ cat tst.awk
BEGIN {
    FS = "[\"[:space:]]*,[\"[:space:]]*"
    OFS = ","
}
NR < 3 {
    split($1,parts," ")
    if ( NR == 1 ) {
        date = parts[3]
        time = parts[4]
    }
    else {
        file = parts[3]
        print "Codes Produced"," Count"," PQR"," Run Date"," Run Time"," File Processed"
    }
    next
}
{ print $1, $2, "\"" $3 "\"", date, time, file }

$ awk -f tst.awk InputFile.csv
Codes Produced, Count, PQR, Run Date, Run Time, File Processed
AB1234,5,"PQR2",2022-02-09,12:47,AB-FILE2.20220209.110516
AB-345,10,"PQR2",2022-02-09,12:47,AB-FILE2.20220209.110516
XY890,20,"PQR2",2022-02-09,12:47,AB-FILE2.20220209.110516

답변2

노력하다

awk -F"[ ,]*" '
        {gsub(/"/,"")
        }
NR==1   {print "Codes Produced, Count, PQR, Run Date, Run Time, File Processed"
         DT = $3
         TM = $4
         next
        }
NR==2   {FN = $3
         next
        }
        {print $1,$2,"\"" $3 "\"",DT,TM,FN
        }
' OFS=, file
Codes Produced, Count, PQR, Run Date, Run Time, File Processed
AB1234,5,"PQR2",2022-02-09,12:47,AB-FILE2.20220209.110516
AB-345,10,"PQR2",2022-02-09,12:47,AB-FILE2.20220209.110516
XY890,20,"PQR2",2022-02-09,12:47,AB-FILE2.20220209.110516

관련 정보