Với GNU uniq, hỗ trợ -w
Tùy chọn:
$ cat data
zikla13:Oct:20:22:34
zikla13:Oct:5:00:31
zikla14:Oct:17:22:01
zikla14:Oct:12:23:35
zikla14:Oct:12:23:34
zikla14:Oct:12:00:11
zikla14:Oct:11:23:52
zikla14:Oct:5:22:22
zilka13:Oct:13:23:48
zilka13:Oct:11:00:28
zilka13:Oct:9:22:40
$ uniq -c -w7 data
2 zikla13:Oct:20:22:34
6 zikla14:Oct:17:22:01
3 zilka13:Oct:13:23:48
Như đã chỉ ra trong các bình luận, giả sử trường đầu tiên luôn có bảy ký tự, đó là trong ví dụ của bạn, nhưng nếu nó không có trong đời thực, tôi không nghĩ có cách nào để làm điều đó với uniq (cộng với nếu bạn không Tôi không có GNU uniq, thậm chí -w
sẽ không hoạt động), vì vậy đây là một giải pháp perl:
$ perl -ne '/(.*?):(.*)/;unless (exists $x{$1}){$x{$1}=[0,$2];push @x, $1};$x{$1}[0]++;END{printf("%8d %s:%s\n",$x{$_}[0],$_,$x{$_}[1]) foreach @x}' <data
2 zikla13:Oct:20:22:34
6 zikla14:Oct:17:22:01
3 zilka13:Oct:13:23:48
Đây là cách nó hoạt động:
$ perl -ne
Chạy perl, không phải in từng dòng theo mặc định và sử dụng đối số tiếp theo làm tập lệnh.
/(.*?):(.*)/
Tách dòng đầu vào thành thứ trước dấu hai chấm đầu tiên và thứ sau dấu hai chấm đầu tiên, thành $1
và $2
. split
cũng sẽ làm việc ở đây
unless (exists $x{$1}){$x{$1}=[0,$2];push @x, $1}
Băm %x
sẽ được sử dụng để xác định các dòng và mảng @x
để giữ chúng theo thứ tự (bạn chỉ có thể sử dụng sort keys %x
, nhưng điều đó giả định perl's sort
sẽ sắp xếp theo cách tương tự như đầu vào được sắp xếp.) Vì vậy, nếu chúng ta chưa bao giờ thấy "khóa" hiện tại (nội dung trước dấu hai chấm đầu tiên), hãy khởi tạo một mục băm cho khóa và nhấn phím vào @x
. Mục băm cho mỗi khóa là một mảng hai phần tử chứa số đếm và giá trị đầu tiên được nhìn thấy sau dấu hai chấm, do đó đầu ra có thể chứa giá trị đó.
$x{$1}[0]++
Tăng số lượng.
END{
Bắt đầu một khối sẽ được chạy sau khi tất cả các đầu vào đã được đọc.
printf("%8d %s:%s\n",$x{$_}[0],$_,$x{$_}[1])
In số đếm, được đệm bằng khoảng trắng, dấu cách, "phím", dấu hai chấm và nội dung từ sau dấu hai chấm.
foreach @x}
Làm điều đó cho mỗi khóa được nhìn thấy, theo thứ tự và kết thúc khối END.
<data
Đọc từ tệp được gọi là dữ liệu trong thư mục hiện tại để có được đầu vào. Bạn cũng có thể chuyển thành perl nếu bạn có một số lệnh hoặc đường ống khác tạo dữ liệu.