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 이 코드로 구문 오류 메시지를 계속 수신합니다.
식별 및 추가는 자체적으로 수행 할 수 있지만 하나의 명령으로 결합하는 데 문제가 있습니다.
댓글
답변
다음은 조회 가능성을 위해 확장 된 코드입니다.
awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { ($1 == "chr"$1); print $0} }; else { print $0 } " filename > newfilename
생각할만한 많은 문제가 있습니다.
- 당신은 시도하기 위해 할당 대신 동등 비교를 사용하고 있습니다.
chr
접두사를 추가합니다. - 대괄호 안에 할당해야하는 것을 입력했습니다.
- 외부 첫 번째
-
else
부분 앞에 세미콜론이 없어야합니다. - 마지막 마감이 누락되었습니다.
}
다음은 여전히 확장 된 고정 버전입니다.
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/)
중 하나 여야합니다.
'{ if ( this is given) { do this } else { do that } }'