쉘을 사용하여 파일의 짝수 라인과 두 번째 열의 문자열 바꾸기

쉘을 사용하여 파일의 짝수 라인과 두 번째 열의 문자열 바꾸기

수동으로 생성된 gff 파일이 있습니다. 각 행은 반복되며 각 짝수 행의 두 번째 열에서 문자열 "gene"을 문자열 "cds"로 바꿔야 합니다.

내 파일은 다음과 같습니다.

NC_002929.2 Seq gene    3653563 3653611 .   +   .   Pred285
NC_002929.2 Seq gene    3653563 3653611 .   +   .   Pred285
NC_002929.2 Seq gene    2902987 2903162 .   -   .   rgtA
NC_002929.2 Seq gene    2902987 2903162 .   -   .   rgtA

나는 그것이 다음과 같이 보이기를 원합니다 :

NC_002929.2 Seq gene    3653563 3653611 .   +   .   Pred285
NC_002929.2 Seq cds     3653563 3653611 .   +   .   Pred285
NC_002929.2 Seq gene    2902987 2903162 .   -   .   rgtA
NC_002929.2 Seq cds     2902987 2903162 .   -   .   rgtA

실제 파일은 이보다 훨씬 큽니다. 이는 단지 작은 예일 뿐입니다. 누구든지 나를 도와줄 수 있나요?

답변1

GNU sed가 있다고 가정n 스킵 m주소 연산자이며 문자열은 gene두 번째 열 앞 어디에도 나타날 수 없습니다.

sed '2~2s/gene/cds/' file.gff

sed에는 "열"이라는 본질적인 개념이 없습니다. 2~2여기서는 두 개의 열을 의미합니다.철사2일부터 시작철사gene, 일치하는 줄에서 첫 번째 항목을 바꿉니다 .


마지막 "열"에 교체를 적용하려면 줄 끝에 고정된 공백이 아닌 문자를 일치시키는 것과 같은 작업을 수행해야 합니다.

sed -r '2~2{s/gene/cds/; s/[^[:blank:]]+$/ID=&/;}' file.gff

진정한 열 지향적인 것을 원한다면 awk, perl 또는 miller를 사용해 보십시오.

답변2

또한 다음 awk접근 방식을 시도해 보세요.

awk  -F"[ ]" '!(NR%2) {sub (/gene/, "cdc ", $3); $NF = "ID=" $NF}  1' file
NC_002929.2 Seq gene    3653563 3653611 .   +   .   Pred285
NC_002929.2 Seq cdc     3653563 3653611 .   +   .   ID=Pred285
NC_002929.2 Seq gene    2902987 2903162 .   -   .   rgtA
NC_002929.2 Seq cdc     2902987 2903162 .   -   .   ID=rgtA

관련 정보