У меня есть файл. Я должен распечатать все количества с уникальными значениями никакие дубликаты, с помощью жемчуга

В примере ниже, количество является полем с эти '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|

и так далее.....

0
задан 28 December 2016 в 14:35

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|
1
ответ дан 7 November 2019 в 06:18

Так как Вы отметили свой вопрос 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 от соответствия regex:

$ 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 и затем цикл по хешу. Вы можете дополнительно sort на keys в том понтонном мосту:

$ 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
4
ответ дан 7 November 2019 в 06:18

Другие вопросы по тегам:

Похожие вопросы: