파일에서 전화번호를 읽고 다른 파일에 고유하게 저장합니다.

파일에서 전화번호를 읽고 다른 파일에 고유하게 저장합니다.

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) 사이의 항목이 일치하는 것입니다.

관련 정보