Назад | Перейти на главную страницу

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

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

0009300|05408736032|89|01|001|0|0|0|1|NNNNNNYNNNNNNNNN|asdf|
0009367|05408736032|89|01|001|0|0|0|1|NNNNNNYNNNNNNNNN|adff|
awk -F \| '{if ($2 != 05408736032) print}'

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

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

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

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

Чистый Баш:

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 $!;