awk를 사용하여 다음 줄을 쉼표로 구분하여 첫 번째 줄의 끝으로 가져오려면 어떻게 해야 합니까?

awk를 사용하여 다음 줄을 쉼표로 구분하여 첫 번째 줄의 끝으로 가져오려면 어떻게 해야 합니까?

공개적으로 사용 가능한 데이터베이스에서 .fa일부 형식의 시퀀스를 다운로드했습니다. .csv시퀀스 이름과 길이를 쉼표로 구분하여 포함하는 파일을 생성하고 싶습니다 . 입력 파일은 다음과 같습니다.

>cel-let-7-5p MIMAT0000001 Caenorhabditis elegans let-7-5p
UGAGGUAGUAGGUUGUAUAGUU
>cel-let-7-3p MIMAT0015091 Caenorhabditis elegans let-7-3p
CUAUGCAAUUUUCUACCUUACC
>cel-lin-4-5p MIMAT0000002 Caenorhabditis elegans lin-4-5p
UCCCUGAGACCUCAAGUGUGA
>cel-lin-4-3p MIMAT0015092 Caenorhabditis elegans lin-4-3p
ACACCUGGGCUCUCCGGGUACC
>cel-miR-1-5p MIMAT0020301 Caenorhabditis elegans miR-1-5p
CAUACUUCCUUACAUGCCCAUA

헤더 행의 첫 번째 항목을 선택하고 다음 행의 판독값 크기를 인쇄하려면 다음 명령을 사용합니다.

grep -A 1 "^>" file_name.fa | awk '{print($1); getline; print length($0)}'

이것이 내가 얻은 것입니다. 산출:

>cel-let-7-5p
22
>cel-let-7-3p
22
>cel-lin-4-5p
21
>cel-lin-4-3p
22
>cel-miR-1-5p
22

.csv하지만 원하는 출력에서는 Excel/R/python으로 내보낼 수 있는 파일을 만들고 싶습니다 . 예상 출력:

cel-let-7-5p,22
cel-let-7-3p,22
cel-lin-4-5p,21
cel-lin-4-3p,22
cel-miR-1-5p,22

내가 할 수 있는 방법이 있나요? 온라인에서 도움을 찾을 수 없습니다.

답변1

그리고(사용을 피하세요getline()반드시 필요하지 않은 경우):

$ awk '
    /^>/{sub(/^>/, "");printf "%s,", $1;next}    # process lines starting with '>'
    {print length()}                             # other lines
' file_name.fa 

산출

cel-let-7-5p,22
cel-let-7-3p,22
cel-lin-4-5p,21
cel-lin-4-3p,22
cel-miR-1-5p,22

답변2

각 헤더 행 뒤에 시퀀스 라인이 하나만 있다고 가정하면 시퀀스를 헤더 끝으로 이동한 다음 awk헤더의 첫 번째 부분과 끝의 시퀀스 길이를 추출하는 데 사용할 수 있습니다.

를 사용하여 paste행을 읽고 탭으로 구분된 두 개의 열에 붙여넣은 다음 awk처리되도록 전달합니다.

$ paste - - <file | awk -v OFS=, '{ sub("^>",""); print $1, length($NF) }'
cel-let-7-5p,22
cel-let-7-3p,22
cel-lin-4-5p,21
cel-lin-4-3p,22
cel-miR-1-5p,22

sub()명령은 시작 >문자를 제거합니다.

답변3

$ awk -F'[> ]' '{ printf ("%s", NR%2?$2",":length() ORS ) }' infile
cel-let-7-5p,22
cel-let-7-3p,22
cel-lin-4-5p,21
cel-lin-4-3p,22
cel-miR-1-5p,22

코드는 두 세트의 공백 >문자를 필드 구분 기호로 정의한 다음 삼항 연산자를 사용하여 (condition ? do-if-true : do-if-false)줄 번호가 다음과 같은지 확인합니다.이상한number( 줄 번호가 홀수이면 1을 반환), 그렇지 않으면 줄 번호가 NR%2홀수이면 열 2 뒤에 쉼표를 인쇄하도록 선택합니다 .$2","심지어number( NR%2줄 번호가 짝수이면 0을 반환), 선택적으로 length()현재 줄의 + 출력 레코드 구분 기호(ORS, 기본값은 개행)를 인쇄합니다.

답변4

awk '/^>/ {a=$1; next} {print a,length}' OFS=, file

관련 정보