Dosyadaki bir alanın farklı değerlerini sayma


17

Milyonlarca satır içeren bir dosyam var. Satırlarda transactionidtekrarlanan değerleri olan bir alanım var. Yapmam gereken, onları belirgin bir şekilde saymak.

Bir değerin kaç kez tekrarlandığı önemli değil, sadece bir kez sayılmalıdır.


sadece dosya biçimini bir bakış verebilir eğer daha kolay olurdu, illa ki veri değil.
Nikhil Mulley

btw, kaç kez olduğuna bakılmaksızın değerin 1 olarak sayılmasını mı istiyorsunuz yoksa tekrarlama / tekrar sayısı mı istiyorsunuz? sadece bir kez sayılmasını istiyorsanız, o zaman farklı değerler nasıl sayılır? Lütfen sorunuzdaki düzenlememi kontrol edip yorumlama konusunda haklı olup olmadığımı doğrular mısınız?
Nikhil Mulley

@Nikhil Bu sorudan net:... No matter of how many times a value is repeated, it should be counted as 1. ...

tamam, o zaman @hesse'den cevap ihtiyacınızı karşılardı.
Nikhil Mulley

gecikme için özür dilerim. İnternet bağlantım kesildi. ayırıcı 2 | ve alan 28. alandır. cat <file_name> | awk -F"|" '{if ((substr($2,0,8)=='20120110')) print $28}' | sort -u | wc -l if cümlesi açık bir şekilde göründüğü gibi başka bir tarih kontrolü için :)
Olgun Kaya

Yanıtlar:


23

Tamam, Dosyanızın, virgül ayırıcısı ',' ile ayrılmış alanlara sahip bir metin dosyası olduğu varsayılarak. Ayrıca hangi alanın 'transactionid'konumu açısından olduğunu da bilirsiniz . Alanınızın 'transactionid'7. alan olduğunu varsayarsak .

awk -F ',' '{print $7}' text_file | sort | uniq -c

Bu, 7. alandaki farklı / benzersiz oluşumları sayar ve sonucu yazdırır.


Neden komuttan sortönce uniq.
g10guang

@ g10guang Yan yana uniqolmaları gereken kayıtları elimine ettikleri için.
dsz

3

Belki en şık yöntem değil, ama bu işe yarayacak:

awk '{print $1}' your_file | sort | uniq | wc -l

burada $1alana karşılık gelen sayı ayrıştırılmasına edilir.


3

Dosyayı sıralamaya gerek yoktur .. ( uniqdosyanın sıralanmasını gerektirir)
Bu awk betiği, alanın ilk boşlukla sınırlandırılmış alan olduğunu varsayar.

awk 'a[$1] == "" { a[$1]="X" } END { print length(a) }' file 

Büyük bir dosya için (olduğu gibi, RAM boyutuna yaklaşırken), awk çok fazla bellek tüketir. Çoğusort uygulama, büyük dosyalarla iyi başa çıkmak için tasarlanmıştır.
Gilles 'SO- kötü olmayı bırak'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.