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