![AWK를 사용하여 각 열의 특정 문자 수를 계산하고 이를 새 열로 추가하는 방법은 무엇입니까?](https://linux55.com/image/196048/AWK%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EA%B0%81%20%EC%97%B4%EC%9D%98%20%ED%8A%B9%EC%A0%95%20%EB%AC%B8%EC%9E%90%20%EC%88%98%EB%A5%BC%20%EA%B3%84%EC%82%B0%ED%95%98%EA%B3%A0%20%EC%9D%B4%EB%A5%BC%20%EC%83%88%20%EC%97%B4%EB%A1%9C%20%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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