파일 내용에 따라 단어 변경

파일 내용에 따라 단어 변경

두 번째 열에 타임스탬프와 날짜가 포함된 파일이 있습니다. 행에 이러한 단어 중 하나가 포함되어 있으면 아래와 같이 바꿔야 합니다.

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수행하는 작업을 끝에 추가하거나 특정 필드에 대한 작업을 추가할 수 있습니다.printprint

형식을 지정하면 블록이 어떻게 중첩되어 있는지 확인하는 데 도움이 됩니다. 이것은 완벽하게 유효한 구문입니다. 쉘은 작은 따옴표로 묶인 여러 줄의 문자열을 허용하며 awk는 이에 완벽하게 만족합니다. 더 읽기 쉬운 awk 스크립트 형식을 사용하는 것이 좋습니다.

관련 정보