입력 파일 예:
#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
필요한 열을 가져오는 방식으로 수행할 수 있습니다.