Удаление повторяющихся строк из файла с помощью grep

Я хочу удалить все строки, где второй столбец 05408736032.

0009300 | 05408736032 | 89 | 01 | 001 | 0 | 0 | 0 | 1 | NNNNNNYNNNNNNNNN | ASDF |
0009367|05408736032|89|01|001|0|0|0|1|NNNNNNYNNNNNNNNN|adff|

5 ответов

Решение

Это может делать то, что вы хотите:

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

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

perl -ne '$a=(split "\\|")[1]; next if $h{$a}++; print;' foo.dat
awk -F \| '{if ($2 != 05408736032) print}'

Чистый Баш:

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

но, как и большинство сценариев оболочки, это довольно неэффективно. Вам лучше сделать это в Perl, что-то вроде:

@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"? Будут ли все строки отформатированы одинаково? Если это так, это должно вывести файл без этих строк (это perl, который принимает исходный файл в качестве первого аргумента, а файл, в который он собирается, как второй).

#!/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 $!;
Другие вопросы по тегам