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