ファイルから電話番号を読み、他のファイルに一意に保存します。

ファイルから電話番号を読み、他のファイルに一意に保存します。

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)の間のエントリが一致することです。

関連情報