Удаление повторяющихся строк из файла с помощью 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
Чистый Баш:
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 $!;