텍스트/시퀀스 파일에서 문자 위치를 찾아야 합니까?

텍스트/시퀀스 파일에서 문자 위치를 찾아야 합니까?

예를 들어, 시퀀스_테스트라는 텍스트 파일에 다음 시퀀스가 ​​있습니다. AAAAATGATGATGTGATTAAATTTTTGAGTGATATGATATTTTTAGATATGAGTAGGATAGTATAGATAG

모든 "A" 문자의 위치 번호를 찾아 출력으로 반환하고 싶습니다. 이 작업을 수행하려면 어떤 명령을 사용해야 합니까?

답변1

$ fold -w 1 file | sed -n '/A/='
1
2
3
4
5
8
11
16
19
20
21
28
30
34
36
39
41
47
49
51
53
56
59
62
64
67
69
71
73

이는 fold입력된 각 문자를 file자신의 줄로 변환한 후 sed각 줄의 줄 번호를 출력하는 데 사용됩니다 A.

sed명령은 와 같은 다른 명령으로 대체될 수 있습니다 awk '/A/ { print NR }'.

물론 특수한 용도 awk도 가능합니다. 다음은 substr()각 문자를 차례로 추출하고 해당 문자의 위치를 ​​출력하는 데 사용됩니다(있는 경우) A.

awk '{ for (i = 1; i <= length; ++i) if (substr($0,i,1) == "A") print i }' file

쉼표로 구분된 목록의 모든 숫자를 원하는 경우 위 결과를 에 전달하세요 paste -s -d, -.

답변2

사용행복하다(이전 Perl_6)

~$ raku -ne '.from.put for m:g/A/;' file

한 줄의 파일만 있는 경우 위의 간단한 코드를 사용할 수 있습니다. 이 .from호출은 일치가 시작되는 위치(인덱스 0)를 알려줍니다. 또는 .to경기가 끝난 곳으로 돌아가는 방법을 사용할 수 있습니다. 어느 쪽이든 위치는 한 줄에 하나씩 반환됩니다.

여러 줄의 파일이 있는 경우 일치하는 문자가 어디에 있는지 알고 싶을 것입니다.각 라인. 다음 코드는 해시 배열을 생성하며 그 역할은 다음과 같습니다.

~$ raku -ne 'state %a; state $i; $i++; for m:g/A/ { %a.push: $i => $_.from }; END .say for %a.sort;'   file

샘플 입력(OP의 샘플 뉴클레오티드 서열, 사이에 빈 줄이 있는 두 번):

AAAAATGATGATGTGATTAAATTTTTGAGAGTGATATGATATTTTTATAGATATGAGTAGGATAGTATAGATAG

AAAAATGATGATGTGATTAAATTTTTGAGAGTGATATGATATTTTTATAGATATGAGTAGGATAGTATAGATAG

예제 출력:

1 => [0 1 2 3 4 7 10 15 18 19 20 27 29 33 35 38 40 46 48 50 52 55 58 61 63 66 68 70 72]
3 => [0 1 2 3 4 7 10 15 18 19 20 27 29 33 35 38 40 46 48 50 52 55 58 61 63 66 68 70 72]

일반적으로 .say사람이 읽을 수 있는 출력을 제공하기 위해 Raku에서 사용되지만 긴 시퀀스(99개 이상의 요소)가 잘리기 .put때문에 제작 에 권장됩니다..say

위에서 참고 사항: 각 행(첫 번째 행이라고 가정)에 대한 결과만 반환하려면 다음과 같이 END .say for %a.sort 해당 키를 호출하여 <1>관련 값을 반환하도록 위의 코드를 변경합니다.END .put for %a<1>;

출력 예(사용법 END .put for %a<1>;):

0 1 2 3 4 7 10 15 18 19 20 27 29 33 35 38 40 46 48 50 52 55 58 61 63 66 68 70 72

https://raku.org

관련 정보