awk if-then-else 문 오류

awk if-then-else 문 오류

awk를 사용하여 bash 스크립트에 if-then-else 문을 작성하고 있습니다.

내가 원하는 것은 col 1 값이 특정 문자열(rs 또는 chr)과 일치하지 않는 행을 식별하고 식별된 행의 col 1 값에 접두사(chr)를 추가하는 것입니다. 일치하는 문자열이 있는 모든 줄은 추가하지 않고 있는 그대로 인쇄되어야 합니다.

지금까지 내 코드 줄은 다음과 같습니다.

awk '{if (! ($1 ~ /rs/ || $1 ~ /chr/)) {($1 == "chr"$1); print $0}}; else {print $0}' filename > newfilename

이 코드에 대한 구문 오류 메시지가 계속 나타납니다.

식별 및 추가를 스스로 성공적으로 수행할 수 있지만 이를 단일 명령으로 결합하는 데 문제가 있습니다.

답변1

더 쉽게 볼 수 있도록 확장된 코드는 다음과 같습니다.

awk '
    {
        if (! ($1 ~ /rs/ || $1 ~ /chr/) )
        {
            ($1 == "chr"$1);
            print $0}
        };
        else
        { print $0 }
' filename > newfilename

이에 관련된 질문을 많이 생각해봤는데

  1. 할당 대신 동등 비교를 사용하여 chr접두사를 추가하려고 합니다.
  2. 할당해야 할 내용을 괄호 안에 넣었습니다.
  3. }첫 번째 이후에는 관련 없는 내용이 있습니다.print $0
  4. else이 섹션 앞에는 세미콜론이 없어야 합니다.
  5. }코드를 입력한 후 최종 마감을 놓쳤습니다.

이는 수정된 버전이며 여전히 확장되어 있습니다.

awk '
    {
        if (! ($1 ~ /rs/ || $1 ~ /chr/) )
        {
            $1 = "chr" $1;
            print $0
        }
        else
        { print $0 }
    }
' filename > newfilename

print $0그런 다음 중복된 콘텐츠를 기준 에서 제외하는 간단한 최적화를 확인할 수 있습니다 .

awk '
    {
        if (! ($1 ~ /rs/ || $1 ~ /chr/) )
        {
            $1 = "chr" $1
        }
        print $0
    }
' filename > newfilename

기본적으로는 단순한 "조건 → 수정"이므로 실제로는 awk표준 구조를 사용하여 더욱 단순화할 수 있습니다. 여기에는 awk입력 파일의 각 행을 순차적으로 처리하는 두 개의 명령문이 있습니다 . 첫 번째 줄은 "chr"필요에 따라 접두사를 추가합니다. 두 번째는 각 줄을 인쇄합니다.

awk '
    (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 }
    1
' filename > newfilename

이로 인해 awk가독성이 약간 영향을 받더라도 한 줄로 묶을 수도 있습니다.

awk '(! ($1 ~ /rs|chr/) ) { $1 = "chr" $1 } 1' filename > newfilename

답변2

이 줄을 사용하면 제대로 작동하는 것 같습니다.

awk '!($1 ~ /rs/ || /chr/) {$1="chr"$1}1'

관련 정보