Вы пропускаете эмигрантский пакет разработки
Попробовать
yum install expat-devel
и повторно выполненный делают после этого
хотя я сомневаюсь, что этот вопрос принадлежит на SF
Это могло бы сделать то, что Вы хотите:
sort -t '|' -k 2,2 -u foo.dat
Однако это сортирует вход согласно Вашему полю, которое Вы не можете хотеть. Если Вы действительно только хотите удалить дубликаты, Вашим наилучшим вариантом является Perl:
perl -ne '$a=(split "\\|")[1]; next if $h{$a}++; print;' foo.dat
awk -F \| '$2 != "05408736032"'
– Paused until further notice.
17 September 2009 в 21:24
Чистый Bash:
oldIFS=$IFS
while read line
do
IFS=$'|'
testline=($line) # make an array split according to $IFS
IFS=$oldIFS # put it back as soon as you can or you'll be sooOOoorry
if [[ ${testline[1]} != "05408736032" ]]
then
echo $line
fi
done < datafile
Можно сделать что-то как:
for f in `cat $file`; do
val=`echo $f | cut -d\| -f 2`
if [ `grep $val $file | wc -l` -lt 2 ]; then
echo $f
fi
done
но, как большинство сценариев оболочки, это довольно неэффективно. Вы были бы более обеспеченным выполнением его в жемчуге, чем-то как:
@infile=<>;
foreach (@infile) {
@foo = split(/|/);
if exists $found{$foo[1]} {
$found{$foo[1]}++;
} else {
$found{$foo[1]}++;
}
}
foreach (@infile) {
@foo = split(/|/);
if ($found{$foo[1]} < 2) {
print $_;
}
}
Случается так, что Вы хотите удалить все строки, где второе | разделенное поле содержит '05408736032'? Все строки будут отформатированы то же? Если так, это должно произвести файл минус те строки (это - жемчуг, который берет исходный файл в качестве первого аргумента и файла, в который это идет как второе).
#!/usr/bin/perl
use warnings;
use strict;
my ($file1, $file2) = @ARGV;
open my $origin_file, '<', $file1;
open my $newfile, '>', $file2;
while (my $line = <$origin_file>) {
my @values = split '/|/', $line;
print $newfile $line unless $vaules[1] = '05408736032';
}
close $newfile or die $!;
close $origin_file or die $!;
(Я не протестировал это, таким образом, Вы, вероятно, хотите скопировать исходный файл перед попыткой его),
При чтении снова, можно надеяться захватывать только строки с уникальным вторым столбцом. Это должно сделать это.
#!/usr/bin/perl
use warnings;
use strict;
my ($file1, $file2) = @ARGV;
open my $origin_file, '<', $file1;
open my $newfile, '>', $file2;
while (my $line = <$origin_file>) {
my @values = split '/|/', $line;
print $newfile $line unless defined $unique{$values[1]};
$unique{$vaules[1]} += 1;
}
close $newfile or die $!;
close $origin_file or die $!;