AWK를 사용하여 각 열의 특정 문자 수를 계산하고 이를 새 열로 추가하는 방법은 무엇입니까?

AWK를 사용하여 각 열의 특정 문자 수를 계산하고 이를 새 열로 추가하는 방법은 무엇입니까?

N파일의 두 번째 열에 있는 문자 수를 세고 이 수를 세 번째 열에 인쇄하고 싶습니다 . 입력 파일 예(탭으로 구분):

sample1 TCTNG
sample2 CCNGGGGGTN
sample3 GGGNNNTC

원하는 출력(탭으로 구분):

sample1 TCTNG   1
sample2 CCNGGGGGTN  2
sample3 GGGNNNTC    3

다음의 엉망인 버전을 얻을 수 있지만 가급적이면 한 줄짜리 버전을 원합니다 awk.

> awk -F '\t' '{print $2}' file.txt | awk -FN '{print NF-1}' > NCount.txt
> paste -d '\t' file.txt NCount.txt

sample1 TCTNG   
    1
sample2 CCNGGGGGTN  
    2
sample3 GGGNNNTC
    3

답변1

awk 'BEGIN{FS=OFS="\t"} {print $0, gsub(/N/,"",$2)}' file
sample1 TCTNG   1
sample2 CCNGGGGGTN  2
sample3 GGGNNNTC    3

기반: 행당 패턴 수를 인쇄하는 방법은 무엇입니까?

답변2

gsub()함수는 대체가 이루어진 횟수를 반환합니다. 이 사실을 사용하여 두 번째 필드의 문자 수를 계산 N하고 해당 숫자를 각 줄의 새 필드로 추가할 수 있습니다.

$ awk -F '\t' '{ $3 = gsub("N","N",$2) }; 1' file
sample1 TCTNG 1
sample2 CCNGGGGGTN 2
sample3 GGGNNNTC 3

출력은 후행으로 인해 발생합니다 ( 또는 1사용과 동일 ).{ print }{ print $0 }

OFS출력에서 기본값(공백) 외에 다른 필드 구분 기호를 사용하려면 특수 변수의 값을 설정합니다 . 여기서는 입력 필드 구분 기호가 다음과 같이 설정된 것을 사용합니다.

$ awk -F '\t' 'BEGIN { OFS=FS } { $3 = gsub("N","N",$2) }; 1' file
sample1 TCTNG   1
sample2 CCNGGGGGTN      2
sample3 GGGNNNTC        3

Perl에서도 비슷하지만 tr대신 연산자를 사용합니다 gsub().

$ perl -MEnglish -a -F '\t' -e 'BEGIN { $OFS="\t"; $ORS="\n" } print @F, ($F[1] =~ tr/N/N/)' file
sample1 TCTNG   1
sample2 CCNGGGGGTN      2
sample3 GGGNNNTC        3

답변3

Raku(이전 Perl_6) 사용

raku -ne 'put ~$/.join("").chars if m:g/N*/;'  

입력 예:

sample0 TCTG
sample1 TCTNG
sample2 CCNGGGGGTN
sample3 GGGNNNTC

예제 출력:

sample0 TCTG    0
sample1 TCTNG   1
sample2 CCNGGGGGTN  2
sample3 GGGNNNTC    3

위의 코드는 먼저 Raku $_테마 변수(뒤에 )를 인쇄한 다음 인쇄합니다. 연결된 일치 항목의 수 \t는 각 행의 끝에 새 열로 추가됩니다.join("")N

https://raku.org

관련 정보