从文件中读取电话号码并将其唯一存储在其他文件中

从文件中读取电话号码并将其唯一存储在其他文件中

我有输入文本文件,例如,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)之间的任何内容的匹配

相关内容