【问题标题】:perl - sort by MAC Addressperl - 按 MAC 地址排序
【发布时间】:2013-09-30 22:44:08
【问题描述】:

我有一个包含设备信息的长 .csv 文件。每条线路都是一个独特的设备,其信息如下所示:

MACaddr,,,,Date,Date,,"b,n",,blahblahblah

我需要做的是获取文件,然后将具有相同供应商 MAC(即 MAC 地址的前 3 个八位字节)的所有线路/设备组合在一起写入一个新文件。我可以轻松地接受每一行并使用正则表达式获取供应商 MAC,但随后我被卡住了。

我只有:

#!usr/bin/perl
use strict;
use warnings;

open IN, "wirelessClients.csv" or die "Couldn't open file\n$!";
open OUT, ">sortedClients.csv" or die "Couldn't open out file\n$!";

my @clients = <IN>;

foreach my $client (@clients)
{
    if($client =~ /^(\w+:\w+:\w+)/)
    {
        print OUT "$1,$client\n\n"; 
    }
}

我不知道如何对信息进行排序。

任何帮助和/或指导将不胜感激!

【问题讨论】:

  • 考虑using lexical filehandles,除非你有很深的理由不这样做。
  • 哦,哇,那真是难以置信的简单...谢谢!
  • 还有很好的信息,pilcrow,谢谢。我会调整我的方式。
  • 不客气。已移至答案,以便您可以关闭问题。
  • @pilcrow 在 8 行脚本上?!为什么呢?这就像说永远没有主线代码,而只编写带有子程序的模块。还有很多更重要的事情需要担心。\n\n\n\n

标签: perl sorting mac-address


【解决方案1】:

如果 MAC 地址是第一个元素,简单的排序应该将具有相同前 3 个八位字节的一组:

sort wirelessClients.csv > sortedClients.csv

【讨论】:

    【解决方案2】:

    当我们正在查看第一个八位字节时,您可以简单地按 numerically alphanumerically 排序:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    
    open (my $in, '<', "wirelessClients.csv") or die "Cannot open Infile: $!";
    open (my $out, '>',"sortedClients.csv") or die "Cannot open Outfile: $!";
    
    my @clients = <$in>;
    
    my @sorted = sort {$a cmp $b} @clients;
    
    foreach @sorted {
        print $out $_;
    }
    

    【讨论】:

    • 你想要字符串cmp,而不是&lt;=&gt;,因为这些是“十六进制冒号”规范格式的 MAC,并且 OP 需要按前三个八位字节分组。此外,$out 之后的逗号不会满足您的要求。
    猜你喜欢
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2022-07-06
    • 2015-12-29
    • 1970-01-01
    • 2018-04-04
    相关资源
    最近更新 更多