Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果包含相同的单词,则从xml文件中删除行(perl)_Perl - Fatal编程技术网

如果包含相同的单词,则从xml文件中删除行(perl)

如果包含相同的单词,则从xml文件中删除行(perl),perl,Perl,我有一个文件“frequencies.xml”,其中包含以下表单行: <?xml version="1.0"?> <!DOCTYPE stationlist PUBLIC "-//xxxxx//DTD stationlist 1.0//EN" "http://xxxxxxxxx/DTD/xxxxxxxx.dtd"> <frequencies xmlns="http://xxxxxxxxxxxxxxxx/DTD/"> <list norm="PAL"

我有一个文件“frequencies.xml”,其中包含以下表单行:

<?xml version="1.0"?>
<!DOCTYPE stationlist PUBLIC "-//xxxxx//DTD stationlist 1.0//EN"   "http://xxxxxxxxx/DTD/xxxxxxxx.dtd">
<frequencies xmlns="http://xxxxxxxxxxxxxxxx/DTD/">
 <list norm="PAL" frequencies="Custom" audio="bg">
..............................................................
<station name="A" active="1" channel="48.25MHz" norm="PAL"/>
<station name="B" active="1" channel="55.25MHz" norm="PAL"/>
<station name="C" active="1" channel="62.25MHz" norm="PAL"/>
<station name="D" active="1" channel="112.25MHz" norm="PAL"/>
..............................................................
<station name="E" active="1" channel="119.25MHz" norm="PAL"/>
<station name="F" active="0" channel="48.25MHz" norm="PAL"/>
..............................................................
<station name="G" active="1" channel="55.25MHz" norm="PAL"/>
<station name="H" active="0" channel="62.25MHz" norm="PAL"/>
..............................................................
  </list>
 </frequencies>

..............................................................
..............................................................
..............................................................
..............................................................
我想删除被认为是重复的线路,如果它包含和其他线路相同的频率

输出结果:

<station name="A" active="1" channel="48.25MHz" norm="PAL"/>
<station name="B" active="1" channel="55.25MHz" norm="PAL"/>
<station name="C" active="1" channel="62.25MHz" norm="PAL"/>
<station name="D" active="1" channel="112.25MHz" norm="PAL"/>
<station name="E" active="1" channel="119.25MHz" norm="PAL"/>

我编写脚本来执行此操作:

for i in `cat frequencies.xml | sed 's/.*channel="\([^"]*\)".*/\1/; /</ d' |grep MHz`; do
cat frequencies.xml | awk -v i="channel=\"$i" '
    BEGIN       { a=0 }
    $0 ~ i      { if ( a == "1" ) { print i"\" - duplicate" > "/dev/stderr"  ; next ;} ; a=1 } 
            { print $_ }' > frequencies.xml.tmp && \
mv frequencies.xml.tmp frequencies.xml
done

对于'cat frequencies.xml|sed's/*channel=“\([^“]*\)”*/\1/;/中的i,保留一个散列以跟踪您看到的频率,如果您看到了,请不要发出以下行:

open INPUT, '<', 'frequencies.xml' or die "Can't read file : $!";
my %seen = ();
foreach my $line ( <INPUT> ) {
   my ( $freq ) = ( $line =~ m/channel="([^"]+)"/ );
   print $line unless $seen{$freq};
   $seen{$freq}++;
}
close INPUT;

打开输入,“保留一个散列以跟踪您看到的频率,如果您看到了,请不要发出以下行:

open INPUT, '<', 'frequencies.xml' or die "Can't read file : $!";
my %seen = ();
foreach my $line ( <INPUT> ) {
   my ( $freq ) = ( $line =~ m/channel="([^"]+)"/ );
   print $line unless $seen{$freq};
   $seen{$freq}++;
}
close INPUT;

打开输入,“使用单行脚本的一种方式:

perl -ne '($freq) = m/(?i)channel="([^"]+)/; print unless exists $arr{ $freq }; $arr{ $freq } = 1' infile

使用单行脚本的一种方法:

perl -ne '($freq) = m/(?i)channel="([^"]+)/; print unless exists $arr{ $freq }; $arr{ $freq } = 1' infile
使用XML::XSH2:

use XML::XSH2;
xsh q{
    open so-8853324.xml;
    $ch := hash @channel //station;
    for { keys %$ch } ls xsh:lookup("ch", .)[1];
};
我从数据中删除了名称空间以简化代码。

使用XML::XSH2:

use XML::XSH2;
xsh q{
    open so-8853324.xml;
    $ch := hash @channel //station;
    for { keys %$ch } ls xsh:lookup("ch", .)[1];
};

我从数据中删除了名称空间以简化代码。

无需反斜杠字符类内的点:
/([\d.]+)MHz/
无需反斜杠字符类内的点:
/([\d.]+)MHz/
use XML::XSH2;
xsh q{
    open so-8853324.xml;
    $ch := hash @channel //station;
    for { keys %$ch } ls xsh:lookup("ch", .)[1];
};