我有一个文件。我需要使用 perl 打印所有具有唯一值且无重复的数量

我有一个文件。我需要使用 perl 打印所有具有唯一值且无重复的数量

在下面的例子中,数量是带有“38”标签的字段,例如第一行的 38=100。

Order:167342,9=205|21=1|553=2453|49=11342|56=MBT|10=085|55=/GCQ3|1=30532|114=Y|40=1|35=D|54=|60=20130624-09:45:02.046|34=388|11=|38=100|52=20130624-09:45:02.046|59=0|100=MBTX|43=Y|8=FIX.4.4|

Order:544291,52=20130624-09:45:02.046|59=0|100=MBTX|43=Y|8=FIX.4.4|54=|60=20130624-09:45:02.046|40=1|35=D|34=388|11=|38=100|56=MBT|1=30532|114=Y|10=085|55=/GCQ3|9=205|21=1|553=2453|49=11342|

Order:916070,35=D|40=1|54=|60=20130624-09:45:02.046|38=234|34=388|11=|59=0|52=20130624-09:45:02.046|8=FIX.4.4|100=MBTX|43=Y|9=205|553=2453|49=11342|21=1|56=MBT|55=/GCQ3|10=085|1=30532|114=Y|

Order:332907,9=205|49=11342|553=2453|21=1|56=MBT|114=Y|1=30532|55=/GCQ3|10=085|60=20130624-09:45:02.046|54=|35=D|40=1|38=26|11=|34=388|59=0|52=20130624-09:45:02.046|8=FIX.4.4|43=Y|100=MBTX|

Order:385327,38=100|34=388|11=|35=D|40=1|60=20130624-09:45:02.046|54=|8=FIX.4.4|43=Y|100=MBTX|59=0|52=20130624-09:45:02.046|553=2453|49=11342|21=1|9=205|55=/GCQ3|10=085|1=30532|114=Y|56=MBT|

Order:610550,59=0|52=20130624-09:45:02.046|8=FIX.4.4|100=MBTX|43=Y|35=D|40=1|54=|60=20130624-09:45:02.046|38=521|11=|34=388|56=MBT|55=/GCQ3|10=085|1=30532|114=Y|9=205|553=2453|49=11342|21=1|

Order:408689,59=0|52=20130624-09:45:02.046|8=FIX.4.4|43=Y|100=MBTX|35=D|40=1|60=20130624-09:45:02.046|54=|38=658|34=388|11=|56=MBT|55=/GCQ3|10=085|114=Y|1=30532|9=205|49=11342|553=2453|21=1|

Order:43899,56=MBT|10=085|55=/GCQ3|114=Y|1=30532|9=205|21=1|49=11342|553=2453|52=20130624-09:45:02.046|59=0|100=MBTX|43=Y|8=FIX.4.4|40=1|35=D|60=20130624-09:45:02.046|54=|11=|34=388|38=531|

输出:- 如果有三个 38tags 具有相同的值,则只会显示一个输出:结果应该是这样的:-

Order:167342,9=205|21=1|553=2453|49=11342|56=MBT|10=08‌​5|55=/GCQ3|1=30532|1‌​14=Y|40=1|35=D|54=|6‌​0=20130624-09:45:02.‌​046|34=388|11=|38=10‌​0|52=20130624-09:45:‌​02.046|59=0|100=MBTX‌​|43=Y|8=FIX.4.4| 

Order:916070,35=D|40=1|54=|60=20130624-09:45:02.046|38=234|3‌​4=388|11=|59=0|52=20‌​130624-09:45:02.046|‌​8=FIX.4.4|100=MBTX|4‌​3=Y|9=205|553=2453|4‌​9=11342|21=1|56=MBT|‌​55=/GCQ3|10=085|1=30‌​532|114=Y|

等等 .....

答案1

既然您标记了您的问题perl,那么使用 perl 哈希怎么样?

$ perl -ne '/[,|](38=\d+)/ ; print unless $seen{ $1 }++' file
Order:167342,9=205|21=1|553=2453|49=11342|56=MBT|10=085|55=/GCQ3|1=30532|114=Y|40=1|35=D|54=|60=20130624-09:45:02.046|34=388|11=|38=100|52=20130624-09:45:02.046|59=0|100=MBTX|43=Y|8=FIX.4.4|
Order:916070,35=D|40=1|54=|60=20130624-09:45:02.046|38=234|34=388|11=|59=0|52=20130624-09:45:02.046|8=FIX.4.4|100=MBTX|43=Y|9=205|553=2453|49=11342|21=1|56=MBT|55=/GCQ3|10=085|1=30532|114=Y|
Order:332907,9=205|49=11342|553=2453|21=1|56=MBT|114=Y|1=30532|55=/GCQ3|10=085|60=20130624-09:45:02.046|54=|35=D|40=1|38=26|11=|34=388|59=0|52=20130624-09:45:02.046|8=FIX.4.4|43=Y|100=MBTX|
Order:610550,59=0|52=20130624-09:45:02.046|8=FIX.4.4|100=MBTX|43=Y|35=D|40=1|54=|60=20130624-09:45:02.046|38=521|11=|34=388|56=MBT|55=/GCQ3|10=085|1=30532|114=Y|9=205|553=2453|49=11342|21=1|
Order:408689,59=0|52=20130624-09:45:02.046|8=FIX.4.4|43=Y|100=MBTX|35=D|40=1|60=20130624-09:45:02.046|54=|38=658|34=388|11=|56=MBT|55=/GCQ3|10=085|114=Y|1=30532|9=205|49=11342|553=2453|21=1|
Order:43899,56=MBT|10=085|55=/GCQ3|114=Y|1=30532|9=205|21=1|49=11342|553=2453|52=20130624-09:45:02.046|59=0|100=MBTX|43=Y|8=FIX.4.4|40=1|35=D|60=20130624-09:45:02.046|54=|11=|34=388|38=531|

要在处理结束时打印总行数,可以修改为

perl -ne '
  /[,|](38=\d+)/ ; print unless $seen{ $1 }++ ; 
  END { print "Total lines: $.\n" }
' file

或打印记录总数(此处定义为38=\d+数量字符串的匹配项)

perl -ne '
  $c += () = /[,|](38=\d+)/ ; print unless $seen{ $1 }++ ; 
  END { print "Total records: $c\n" }
' file

如果您想要唯一数量的数量,则可以使用哈希键的标量值:

$ perl -ne '
  /[,|](38=\d+)/ ; print unless $seen{ $1 }++ ;
  END { print "Unique records: ", scalar keys %seen, "\n" }
' file
Order:167342,9=205|21=1|553=2453|49=11342|56=MBT|10=085|55=/GCQ3|1=30532|114=Y|40=1|35=D|54=|60=20130624-09:45:02.046|34=388|11=|38=100|52=20130624-09:45:02.046|59=0|100=MBTX|43=Y|8=FIX.4.4|
Order:916070,35=D|40=1|54=|60=20130624-09:45:02.046|38=234|34=388|11=|59=0|52=20130624-09:45:02.046|8=FIX.4.4|100=MBTX|43=Y|9=205|553=2453|49=11342|21=1|56=MBT|55=/GCQ3|10=085|1=30532|114=Y|
Order:332907,9=205|49=11342|553=2453|21=1|56=MBT|114=Y|1=30532|55=/GCQ3|10=085|60=20130624-09:45:02.046|54=|35=D|40=1|38=26|11=|34=388|59=0|52=20130624-09:45:02.046|8=FIX.4.4|43=Y|100=MBTX|
Order:610550,59=0|52=20130624-09:45:02.046|8=FIX.4.4|100=MBTX|43=Y|35=D|40=1|54=|60=20130624-09:45:02.046|38=521|11=|34=388|56=MBT|55=/GCQ3|10=085|1=30532|114=Y|9=205|553=2453|49=11342|21=1|
Order:408689,59=0|52=20130624-09:45:02.046|8=FIX.4.4|43=Y|100=MBTX|35=D|40=1|60=20130624-09:45:02.046|54=|38=658|34=388|11=|56=MBT|55=/GCQ3|10=085|114=Y|1=30532|9=205|49=11342|553=2453|21=1|
Order:43899,56=MBT|10=085|55=/GCQ3|114=Y|1=30532|9=205|21=1|49=11342|553=2453|52=20130624-09:45:02.046|59=0|100=MBTX|43=Y|8=FIX.4.4|40=1|35=D|60=20130624-09:45:02.046|54=|11=|34=388|38=531|
Unique records: 6

如果您只想要字段38=qty,那么只需$1从正则表达式匹配中打印:

$ perl -lne '
  /[,|](38=\d+)/ ; print $1 unless $seen{ $1 }++ ;
  END { print "Unique records: ", scalar keys %seen }
' file
38=100
38=234
38=26
38=521
38=658
38=531
Unique records: 6

要输出计数,您必须等到,END然后循环遍历哈希。您可以选择sortkeys此时:

$ perl -lne '
  $seen{ $1 }++ if /[,|](38=\d+)/ ;
  END {
    for $key (sort keys %seen) { print "$seen{$key} $key" };
    print "Unique records: ", scalar keys %seen
  }
' file
3 38=100
1 38=234
1 38=26
1 38=521
1 38=531
1 38=658
Unique records: 6

答案2

如果我理解了这个问题,这个 awk 命令应该可以完成你想要做的事情:

#!/bin/sh
awk -F "[,\|]" '
(NF>0){delete key
printf "%s,", $1
for (i=2; i<=NF-1; i++) {if (key[$i]!=1) printf "%s|", $i
            key[$i]=1}
printf "\n"}' <tf

(其中输入存储在 tf 文件中)

根据您的输入文件,我得到输出:

Order:167342,9=205|21=1|553=2453|49=11342|56=MBT|10=085|55=/GCQ3|1=30532|114=Y|40=1|35=D|54=|60=20130624-09:45:02.046|34=388|11=|38=100|52=20130624-09:45:02.046|59=0|100=MBTX|43=Y|8=FIX.4.4|
Order:544291,52=20130624-09:45:02.046|59=0|100=MBTX|43=Y|8=FIX.4.4|54=|60=20130624-09:45:02.046|40=1|35=D|34=388|11=|38=100|56=MBT|1=30532|114=Y|10=085|55=/GCQ3|9=205|21=1|553=2453|49=11342|
Order:916070,35=D|40=1|54=|60=20130624-09:45:02.046|38=234|34=388|11=|59=0|52=20130624-09:45:02.046|8=FIX.4.4|100=MBTX|43=Y|9=205|553=2453|49=11342|21=1|56=MBT|55=/GCQ3|10=085|1=30532|114=Y|
Order:332907,9=205|49=11342|553=2453|21=1|56=MBT|114=Y|1=30532|55=/GCQ3|10=085|60=20130624-09:45:02.046|54=|35=D|40=1|38=26|11=|34=388|59=0|52=20130624-09:45:02.046|8=FIX.4.4|43=Y|100=MBTX|
Order:385327,38=100|34=388|11=|35=D|40=1|60=20130624-09:45:02.046|54=|8=FIX.4.4|43=Y|100=MBTX|59=0|52=20130624-09:45:02.046|553=2453|49=11342|21=1|9=205|55=/GCQ3|10=085|1=30532|114=Y|56=MBT|
Order:610550,59=0|52=20130624-09:45:02.046|8=FIX.4.4|100=MBTX|43=Y|35=D|40=1|54=|60=20130624-09:45:02.046|38=521|11=|34=388|56=MBT|55=/GCQ3|10=085|1=30532|114=Y|9=205|553=2453|49=11342|21=1|
Order:408689,59=0|52=20130624-09:45:02.046|8=FIX.4.4|43=Y|100=MBTX|35=D|40=1|60=20130624-09:45:02.046|54=|38=658|34=388|11=|56=MBT|55=/GCQ3|10=085|114=Y|1=30532|9=205|49=11342|553=2453|21=1|
Order:43899,56=MBT|10=085|55=/GCQ3|114=Y|1=30532|9=205|21=1|49=11342|553=2453|52=20130624-09:45:02.046|59=0|100=MBTX|43=Y|8=FIX.4.4|40=1|35=D|60=20130624-09:45:02.046|54=|11=|34=388|38=531|

相关内容