Я хочу удалить все строки, в которых второй столбец - 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 $!;