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
이에 관련된 질문을 많이 생각해봤는데
- 할당 대신 동등 비교를 사용하여
chr
접두사를 추가하려고 합니다. - 할당해야 할 내용을 괄호 안에 넣었습니다.
}
첫 번째 이후에는 관련 없는 내용이 있습니다.print $0
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
답변2
이 줄을 사용하면 제대로 작동하는 것 같습니다.
awk '!($1 ~ /rs/ || /chr/) {$1="chr"$1}1'