다음 샘플 레코드가 포함된 mdn.txt 파일이 있습니다.
mdn.txt:
123456,2711448,1,20150214092425,20150714092425,120,20150814163821,,123,,,123,20150214092425,,123,,,123,20150214092425,,123,Y
이제 파일의 각 레코드를 처리 awk
하고 날짜 필드의 형식을 다음과 같이 변경하려고 합니다.
123456,2711448,1,14-02-2015 09:24:25,14-07-2015 09:24:25,120,14-08-2015 16:38:21,,123,,,123,14-02-2015 09:24:25,,123,,,123,14-02-2015 09:24:25,,123,Y
여기에 입력한 날짜는 (예귀,중간 사이즈낮,디이런,시간우리의,중간 사이즈초기의,에스두번째)
YYYYMMDDHHMMSS
출력은 다음과 같아야 합니다.
DD-MM-YYYY HH:MM:SS
답변1
awk 'BEGIN{ FS=OFS=","
n=split("4,5,7,13,19", f) # array of input field numbers
}
{ for(i=1; i<=n; i++) if($f[i]) $f[i] = dconv($f[i]); print
}
function dconv(x) {
YY=substr(x, 1, 4)
mm=substr(x, 5, 2)
dd=substr(x, 7, 2)
hh=substr(x, 9, 2)
nn=substr(x,11, 2)
ss=substr(x,13, 2)
return dd"-"mm"-"YY" "hh":"nn":"ss
}' file
다음은 배열이 하나 더 있고 함수가 없는 (기본적으로) 동일한 스크립트입니다.
awk 'BEGIN{ FS=OFS=","
nf=split("4,5,7,13,19", f) # array of input field numbers
nd=split(",7,2,-,5,2,-,1,4, ,9,2,:,11,2,:,13,2", d) # array of date subfield info (in output order): prefix(out),pos(in),len(in)
}
{ for(i=1; i<=nf; i++){
if($f[i]) {
fmod=""
for(j=1; j<=nd; j+=3) fmod=fmod sprintf("%s", d[j] substr($f[i], d[j+1], d[j+2]))
$f[i] = fmod
}
} print
}' file
답변2
다음으로 14자리 필드가 변환됩니다.
awk -F, ' function form(E){
$E=substr($E,1,4) "-" substr($E,5,2) "-" substr($E,7,2) " "\
substr($E,9,2) ":" substr($E,11,2) ":" substr($E,13)
}
{ for(i=1;i<=NF;i++)
if($i ~ /[0-9]{14}/)
form(i)
print
}' OFS=, mdn.txt
답변3
소스 문자열이 변수 s에 저장되면 printf와 substr을 사용할 수 있습니다.
printf("%2d-%2d-%4d %2d:%2d:%2d", substr(s,7,2), substr(s,5,2), substr(s,1,4), substr( s,9,2), 부분 문자열(s,11,2), 부분 문자열(s,13,2) )