열을 기준으로 누락된 데이터 형식 지정 및 채우기

열을 기준으로 누락된 데이터 형식 지정 및 채우기

이 형식의 데이터가 있고 각 열의 레이블을 기준으로 정렬하고 싶습니다. 누락된 필드를 아래와 같이 쉼표( )로 ,바꾸려고 합니다.

2018-03-13 02:09:12,AB=123,BC=6,CAB=Jax,XYZ=Xax
2018-03-13 02:09:13,AB=234,BC=6,CAB=Jax,XYZ=Ram
2018-03-13 02:11:03,AB=567,BC=6,XYZ=Xulu

예상되는 결과.

2018-03-13 02:09:12,    AB=123, BC=6,   CAB=Jax,    XYZ=Xax
2018-03-13 02:09:13,    AB=234, BC=6,   CAB=Jax,    XYZ=Ram
2018-03-13 02:11:03,    AB=567, BC=6,          ,    XYZ=Xulu

답변1

BEGIN { OFS = FS = "," }

FNR==1 {
    for (i = 2; i <= NF; ++i) {
        split($i, a, "=")
        f[i] = a[1]
    }
}

{
    for (i = 2; i <= NF; ++i) {
        split($i, a, "=")
        if (a[1] != f[i]) {
            for (j = NF + 1; j > i; --j)
                $j = $(j - 1)
            $i = ""
        }

        $i = sprintf("%10s", $i)
    }

    print
}

awk프로그램은 입력 파일의 첫 번째 줄이 다음과 같다고 가정합니다.옳은올바른 위치에 모든 필드가 포함되어 있기 때문입니다.

다음 텍스트에서 "모든 필드" 및 "필드"는 변경되지 않은 첫 번째 필드를 제외한 모든 필드를 나타냅니다.

=첫 번째 행의 경우에만 필드의 이전 비트를 읽고 이를 f배열의 해당 필드 위치에 저장합니다.

모든 행에 대해 필드 내용에 대해 동일한 유형의 분할을 수행 하고 =이전 비트를 배열이 나타내는 =것과 f비교합니다 . 불일치가 있는 경우 해당 지점에서 시작하는 필드가 한 위치 "오른쪽으로 이동"되고 현재 필드가 지워집니다.

그런 다음 모든 필드는 10자의 오른쪽 맞춤 문자열로 다시 포맷되고 수정된 전체 레코드(행)가 인쇄됩니다.

샘플 데이터에서 실행:

$ awk -f script.awk file
2018-03-13 02:09:12,    AB=123,      BC=6,   CAB=Jax,   XYZ=Xax
2018-03-13 02:09:13,    AB=234,      BC=6,   CAB=Jax,   XYZ=Ram
2018-03-13 02:11:03,    AB=567,      BC=6,          ,  XYZ=Xulu

관련 정보