myfile.txt
예를 들어 다음과 같은 데이터가 포함된 입력 텍스트 파일이 있습니다 .
WO_ID
------------------------------------------------------------------------
moveover_virus_8493020020_virus.final
moveover_virus_7483920322_virus.csvwork
잠깐, 전화번호만 변경됩니다. 작업 주문이 13개 정도 있는데 Perl 스크립트가 필요하기 때문에 입력으로 번호만 입력하면 됩니다. 이 스크립트를 작성해야 합니다. grep을 시도하고 있지만 숫자만 얻을 수 없습니다.
답변1
입력 파일을 보면 다음과 유사한 작업을 수행할 수 있습니다 awk
.
awk -F"_" '{print $3}' inputfile | uniq > outputfile
또는 사용 grep
,
grep -o -E '[0-9]+' inputfile | uniq > outputfile
사용 sed
,
sed 's/[^0-9]*//g;/^\s*$/d' inputfile | uniq
답변2
불필요한uniq
awk -F"_" 'NF>2 {if ( !a[$3]++) print $3}' inputfile
어디
NF>2
전화번호가 있는지 확인하세요.!a[$3]++
1
처음과0
다른 시간을 평가할 것입니다 .
답변3
필요에 따라 이 Perl 스크립트를 사용할 수 있습니다.
#!/bin/perl
my $str = "moveover_virus_7483920322_virus.csvwork";
my $phone = (split /_/, $str)[2];
print "$phone\n";
테스트 스크립트:
[iahmad@ijaz-cms ~]$ ./perltest
7483920322
답변4
저는 여기저기 둘러보는 걸 좋아하고 이런 일을 하는 걸 좋아해요. 샘플 데이터를 "test"라는 텍스트 파일에 복사하고 다음 명령을 실행했습니다.
$ grep -oP '(?<=s\_).*(?=\_v)' test
8493020020
7483920322
grep -o는 일치하는 항목만 반환한다는 의미입니다.
-P는 Perl 정규식 사용을 의미합니다.
?<=는 "s_ 이후의 모든 항목과 일치"를 의미합니다("_"는 "\"로 이스케이프해야 함).
?=는 "v_ 이전의 모든 항목과 일치"를 의미합니다("_"는 이스케이프해야 함을 다시 한 번 참고하세요).
따라서 최종 결과는 "s_"(virus_)와 "-v"(_virus) 사이의 항목이 일치하는 것입니다.