awk if-then-else 문 오류

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

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

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

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

I 이 코드로 구문 오류 메시지를 계속 수신합니다.

식별 및 추가는 자체적으로 수행 할 수 있지만 하나의 명령으로 결합하는 데 문제가 있습니다.

댓글

  • 두 번째 중괄호를 닫는 위치를 확인합니다. '{ if ( this is given) { do this } else { do that } }'

답변

다음은 조회 가능성을 위해 확장 된 코드입니다.

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

생각할만한 많은 문제가 있습니다.

  1. 당신은 시도하기 위해 할당 대신 동등 비교를 사용하고 있습니다. chr 접두사를 추가합니다.
  2. 대괄호 안에 할당해야하는 것을 입력했습니다.
  3. 외부 첫 번째
  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 

Answer

이 줄을 사용하면 완벽하게 작동 :

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

댓글

  • ($1 ~ /rs/ || /chr/) "rs"의 경우 $1와 일치하지만 "chr"

와 일치합니다.

. ($1 ~ /rs/ || $1 ~ /chr/) 또는 ($1 ~ /rs|chr/)

중 하나 여야합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다