두 번째 열에 타임스탬프와 날짜가 포함된 파일이 있습니다. 행에 이러한 단어 중 하나가 포함되어 있으면 아래와 같이 바꿔야 합니다.
File:
a smallint
b timestamp
c date
d varchar
O/P:
a smallint
dateformat(b,'YYYY-MM-DD HH:NN:SS.sss')
dateformat(c.'YYYY-MM-DD')
d varchar
아래 명령을 단일 awk로 실행하면 출력이 표시되지만 else 조건을 사용하면 오류가 발생합니다.
awk '{if ($2=="timestamp") {$3="dataformat("; }; print $3 $1 ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)" else ($2=="date") {$3="dataformat("; }; print $3 $1 ",'\''YYYY-MM-DD)" }' test.out
실수:
awk: {if ($2=="timestamp") {$3="dataformat("; }; print $3 $1 ",'YYYY-MM-DD HH:NN:SS.sss)" else ($2=="date") {$3="dataformat("; }; print $3 $1 ",'YYYY-MM-DD)" }
awk: ^ syntax error
답변1
나는 다음과 같이 쓸 것이다:
awk -v q="'" '
$2 == "timestamp" { $0 = sprintf("dateformat(%s, "q"YYYY-MM-DD HH:NN:SS.sss"q")", $1) }
$2 == "date" { $0 = sprintf("dateformat(%s, "q"YYYY-MM-DD"q")", $1) }
{ print }
' file
답변2
먼저 명령을 마무리하겠습니다.
awk '
{
if ($2=="timestamp") {
$3="dataformat(";
};
print $3 $1 ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)"
else ($2=="date") {
$3="dataformat(";
};
print $3 $1 ",'\''YYYY-MM-DD)"
}
' test.out
따라서 두 가지 문제가 있습니다. 하나는 else
절이 절과 일치하지 않는다는 것입니다 if
(절 외부에 명령이 있음 print
). 다른 하나는 절이 else
조건을 허용하지 않아서 조건을 사용하려는 것입니다 else if
.
그렇다면 그게 우리의 의도가 아닐까?
awk '
{
if ($2=="timestamp") {
$3="dataformat("
print $3 $1 ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)"
} else if ($2=="date") {
$3="dataformat("
print $3 $1 ",'\''YYYY-MM-DD)"
}
}
' test.out
일치하지 않는 다른 행으로 무엇을 하고 싶은지 잘 모르겠습니다... 간단한 작업 (기본값은 수정되지 않은 행 인쇄)을 else
수행하는 작업을 끝에 추가하거나 특정 필드에 대한 작업을 추가할 수 있습니다.print
print
형식을 지정하면 블록이 어떻게 중첩되어 있는지 확인하는 데 도움이 됩니다. 이것은 완벽하게 유효한 구문입니다. 쉘은 작은 따옴표로 묶인 여러 줄의 문자열을 허용하며 awk는 이에 완벽하게 만족합니다. 더 읽기 쉬운 awk 스크립트 형식을 사용하는 것이 좋습니다.