원래 문자열이 특정 문자열과 일치하지 않는 경우 문자열을 수정합니다.

원래 문자열이 특정 문자열과 일치하지 않는 경우 문자열을 수정합니다.

수백만 개의 행이 있는 파일이 있고 문자열이 "."인 경우에만 A 열의 값을 수정하고 싶습니다. 수정 사항은 "chr:"$2":"$3문자열 시작 부분에 추가됩니다 . 다른 모든 줄은 원본 버전으로 인쇄됩니다.

입력 예:

A B C D E F G H
rs125 2 5433 T TACA A 3 2
chr2:4543 2 4543 I R 8 2
rs123 3 4332 A C 9 3
. 3 7654 I R 8

위에서 네 번째 줄은 "."으로 시작합니다. "chr3:7654"로 변경해야 합니다. 다른 모든 행은 변경되지 않은 상태로 유지되어야 합니다.

원하는 출력:

A B C D E F G H
rs125 2 5433 T TACA A 3 2
chr2:4543 2 4543 I R 8 2
rs123 3 4332 A C 9 3
chr3:7654 3 7654 I R 8 2

내 코드는 지금까지 작동하지만 "rs..."가 동일하게 유지되어야 하더라도 "chr..."로 시작하도록 모든 이름을 변경합니다.

awk '($1 ~ /^./) {$1 = "chr:"$2":"$3}1' filename > newfilename

이는 매우 간단한 해결책일 수 있지만 매우 큰 문제를 야기합니다. 감사해요!

답변1

문제는 정규 표현식에 있습니다. /^./줄 시작 부분의 유효한 문자와 일치합니다. .문자 그대로 일치시키려면 이스케이프해야 합니다 .

awk '$1 ~ /^\./ {$1 = "chr:"$2":"$3};1' filename > newfilename

하지만 정규식 검사를 수행하는 대신 문자열이 동일한지 확인하는 것이 더 좋습니다.

awk '$1 == "." {$1 = "chr:"$2":"$3};1' filename > newfilename

관련 정보