0

I have input text file e.g myfile.txt which is contains data like

WO_ID 
------------------------------------------------------------------------
moveover_virus_8493020020_virus.final 
moveover_virus_7483920322_virus.csvwork  

etc. only phone number is changing I have some 13 work orders like this I need to take only number as a input from this for that I need a script in perl. I need to create that script I am trying grep but I am unable get only numbers.

Rui F Ribeiro
  • 56,709
  • 26
  • 150
  • 232
rajaputh
  • 3
  • 3

4 Answers4

2

Looking at your input file you can do something like this, using awk:

awk -F"_" '{print $3}' inputfile | uniq > outputfile

or using grep,

grep -o -E '[0-9]+' inputfile | uniq > outputfile

using sed,

sed 's/[^0-9]*//g;/^\s*$/d' inputfile | uniq 
Rahul
  • 13,589
1

no need for uniq

awk -F"_" 'NF>2 {if ( !a[$3]++) print $3}' inputfile

where

  • NF>2 ensure a phone number is present
  • !a[$3]++ will evaluate to 1 first time, 0 other time
Archemar
  • 31,554
0

You can utlizise this perl script for your perpose:

    #!/bin/perl
    my $str = "moveover_virus_7483920322_virus.csvwork";
    my  $phone = (split /_/, $str)[2];
    print "$phone\n";

test the script:

    [iahmad@ijaz-cms ~]$ ./perltest 
    7483920322
Ijaz Ahmad
  • 7,202
  • but I need to take input from a text file which is having 100 work orders like this and I need to delete the repeated values. – rajaputh Jul 21 '16 at 06:44
  • yes u can do that , this is just an example , you can read the file in perl and use a loop through the lines and final output the file – Ijaz Ahmad Jul 21 '16 at 08:18
0

I am a fan of look arounds to do this kind of work. I copied you example data into a text file named "test" and then ran the following

$ grep -oP '(?<=s\_).*(?=\_v)' test 
8493020020
7483920322

grep -o means return only the match

-P means use Perl regex

?<= means "match anything that comes after s_" (note that the "_" needs to be escaped with the "\")

?= means "match anything that comes before v_" (again note that the "_" needs to be escaped)

So the end result is a match for anything between "s_" (virus_) and "-v" (_virus)

rcjohnson
  • 899
  • could you please give me the complete script I am getting errors .I am unable to debug why because I don't know anything about perl – rajaputh Jul 21 '16 at 09:48
  • @rajaputh This is complete. It is a one-line command using grep with the Perl regular expressions. Note that the .* means to match anything between the two regular expressions in the sets of parentheses. – rcjohnson Jul 25 '16 at 00:55