안녕하세요 프로그래밍 초보입니다.
아래 스크립트를 실행하려고 할 때는 이런 형태의 입력 파일을 사용하세요. (이 경우에는 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