удаление дублирующихся строк из файла с grep

Вы пропускаете эмигрантский пакет разработки

Попробовать

yum install expat-devel

и повторно выполненный делают после этого

хотя я сомневаюсь, что этот вопрос принадлежит на SF

0
задан 17 September 2009 в 21:08
5 ответов

Это могло бы сделать то, что Вы хотите:

sort -t '|' -k 2,2 -u  foo.dat

Однако это сортирует вход согласно Вашему полю, которое Вы не можете хотеть. Если Вы действительно только хотите удалить дубликаты, Вашим наилучшим вариантом является Perl:

perl -ne '$a=(split "\\|")[1]; next if $h{$a}++; print;' foo.dat
3
ответ дан 4 December 2019 в 11:00
awk -F \| '{if ($2 != 05408736032) print}'
9
ответ дан 4 December 2019 в 11:00
  • 1
    Можно не учесть " if" и " print": 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
1
ответ дан 4 December 2019 в 11:00

Можно сделать что-то как:

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 $_;
  }
}
0
ответ дан 4 December 2019 в 11:00

Случается так, что Вы хотите удалить все строки, где второе | разделенное поле содержит '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 $!;
0
ответ дан 4 December 2019 в 11:00

Теги

Похожие вопросы