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