문자열의 상대 위치 계산

문자열의 상대 위치 계산

입력 파일 예:

#name   complete(cs)    len(cs) simple(ss)  len(ss) position(ss)
NAME1   A0AAA000AAA00A  14      AAAAAAAA    8        4,6
NAME2   AAAA0AA00000A   13      AAAAAAA     7        7

전체 문자열(cs)의 위치(ss) 열에 제공된 단순화된 문자열(ss)의 일부 문자에 해당하는 위치를 알고 싶다고 가정해 보겠습니다. 참고: 단순 문자열(ss)에는 문자만 허용됩니다. 전체 문자열에서는 모든 문자가 허용됩니다.

이 예에서는 다음을 반환합니다.

예제 출력 파일:

#name   complete(cs)    len(cs) simple(ss)  len(ss) pos(ss) pos(cs)
NAME1   A0AAA000AAA00A  14      AAAAAAAA    8        4,6    5,10
NAME2   AAAA0AA00000A   13      AAAAAAA     7        7      13

나는 현재 Python을 사용하여 이것을 구축하고 있지만 Unix를 사용하는 쉬운 방법이 있다고 확신합니다.

답변1

일방 perl통행:

$ perl -anle '
    print "$_ position(cs)" and next if /^#/;
    printf "%s",$_;
    for $pos_ss (split ",",$F[5]) {
        $char = substr($F[3],$pos_ss-1,1);
        @cs = split //,$F[1];
        @cs_idx = grep {$cs[$_] eq $char} 0..$#cs;
        push @res,++$cs_idx[$pos_ss-1];
    }
    printf "%14s\n", join ",",@res;
    @res=();
' file
#name   complete(cs)    len(cs) simple(ss)  len(ss) position(ss) position(cs)
NAME1   A0AAA000AAA00A  14      AAAAAAAA    8        4,6          5,10
NAME2   AAAA0AA00000A   13      AAAAAAA     7        7            13

어떻게 작동하나요?

  • 처음 두 줄은 원래 항목을 인쇄합니다.
  • for $pos_ss (split ",",$F[5]): 필드 6을 분할하여 간단한 문자열로 필요한 모든 인덱스를 얻습니다.
  • $char = substr($F[3],$pos_ss-1,1): 단순 문자열에서 주어진 인덱스에 있는 문자를 가져옵니다.
  • @cs = split //,$F[1]: 전체 문자열의 모든 문자를 가져와서 배열에 저장합니다.
  • @cs_idx = grep {$cs[$_] eq $char} 0..$#cs: 배열에 있는 @cs모든 동일한 값의 인덱스를 가져옵니다 $char.
  • push @res,++$cs_idx[$pos_ss-1]: 원하는 배열의 인덱스를 저장합니다 @res.
  • 마지막 두 줄은 우리가 얻은 결과와 @res다음 번에 사용할 빈 배열을 인쇄합니다.

답변2

이는 bash 연산자와 하드코딩된 정보로 시작할 수 있습니다. 이것은 매우 자명합니다.

#!/bin/bash

word="A0AAA000AAA00A"
required=(4 6)
match="A"
w=$word

# get the positions of $match in $word
while [ ! -z "$w" ]; do
    n=$(expr index "$w" $match)
    w=${w:$n}
    counter=$(( counter + n ))
#   echo "position $counter. now w=$w"
    pos+=($counter)
done

echo "All positions: ${pos[@]}"

# print the position of $match in $word on positions given by $required
for i in "${required[@]}"
do
    echo "position $i: ${pos[i-1]}"
done

일반적인 경우는 다음과 같은 것을 사용하여 while read; do... done < file필요한 열을 가져오는 방식으로 수행할 수 있습니다.

관련 정보