쉘 스크립트에 잘못된 값이 있습니다

쉘 스크립트에 잘못된 값이 있습니다

안녕하세요 프로그래밍 초보입니다.

아래 스크립트를 실행하려고 할 때는 이런 형태의 입력 파일을 사용하세요. (이 경우에는 nohd*.txt파일이라고 합니다.)

NSGEAPKNFGLDVKITGESENDRDLGTAPGGTLNDIG
IIIIMMMMMOOOOOOOOOOOOOMMMMMMMMMMMIIII

file 의 텍스트가 포함된 열 수를 계산하고 싶습니다. d.txt다음 단계를 참조하세요.

D
O

이를 위해 다음 스크립트를 작성했습니다.

#!/bin/bash
for z in {1..141}
do
        a=0
        l=$(tail -1 nohd$z.txt | wc -m)
        x=$(cat d.txt)
                for ((p; p<=l; p++))
                do
                        if [ "$(cut -c $p nohd$z.txt)" = "$x" ] ; then
                                a=$((a+1))
                                p=$((p+1))
                        fi
                done
        echo $a
done

./script 다음 오류를 표시하는 스크립트를 사용하여 이 스크립트를 실행하고 있습니다 .

cut: invalid byte/character position ‘{1..351}’

첫 번째 값만 올바르게 변환하고 나머지 값은 0으로 변환합니다. 예상되는 출력은 다음과 같은 형식입니다.

5
20
4

누구든지 저를 도와주실 수 있나요? 고마워

답변1

#!/usr/bin/perl

use File::Slurp;

# read d.txt and turn into a regular expression.
my $re = '^(' . join ('|',read_file('./d.txt', chomp => 1)) . ')$';

# read input files and print location of matches.
while (<>) {
  for (my $i=0;$i <= length; $i++) {
    printf "%s\n", $i+1 if (substr($_,$i,1) =~ m/$re/o);
  }
}

이 Perl 스크립트는 입력 줄의 각 "D" 및 "O" 문자 위치를 인쇄합니다.

예를 들어 다른 이름으로 저장하고 islem.pl실행 가능하게 만든 chmod +x islem.pl후 다음과 같이 실행하십시오.

$ ./islem.pl nohd*.txt
12
22
24
35
10
11
12
13
14
15
16
17
18
19
20
21
22

위 출력은 nohd1.txt.


나는 당신의 질문을 오해했다고 생각합니다. 네가 원하는 것 같아계산대신 연속으로 일치합니다.위치모든 게임. 이것이 원하는 것이라면 다음을 시도해 보십시오.

#!/usr/bin/perl -l

use File::Slurp;

# read d.txt and turn into a regular expression.
my $re = '^(' . join ('|',read_file('./d.txt', chomp => 1)) . ')$';

# read input files and print location of matches.
while (<>) {
  my $count=0;
  for (my $i=0;$i <= length; $i++) {
    $count++ if (substr($_,$i,1) =~ m/$re/o);
  };
  print $count;
}

예제 출력:

$ ./islem2.pl nohd*
4
13

이는 많은 변화에 쉽게 적응합니다. 예를 들어, :해당 개수와 함께 구분된 형식으로 파일 이름과 줄 번호를 인쇄 하려는 경우 :

#!/usr/bin/perl -l

use File::Slurp;

# read d.txt and turn into a regular expression.
my $re = '^(' . join ('|',read_file('./d.txt', chomp => 1)) . ')$';

# read input files and print location of matches.
while (<>) {
  my $count=0;
  for (my $i=0;$i <= length; $i++) {
    $count++ if (substr($_,$i,1) =~ m/$re/o);
  };
  print "$ARGV:$.:$count";
} continue {
  # explicitly close the current file on eof to reset the line counter
  # after each input file because perl only has a cumulative line
  # counter ($.) rather than both FR and FNR like awk.
  close ARGV if eof;
}

예제 출력:

$ ./islem3.pl nohd*.txt
nohd1.txt:1:4
nohd1.txt:2:13

관련 정보