使用 grep 从文件中删除重复的行

使用 grep 从文件中删除重复的行

我想删除第二列为 05408736032 的所有行。

0009300|05408736032|89|01|001|0|0|0|1|NNNNNNYNNNNNNNN|asdf|
0009367|05408736032|89|01|001|0|0|0|1|NNNNNNYNNNNNNNN|adff|

答案1

这可能会做你想做的事:

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

但是这会根据字段对输入进行排序,这可能不是您想要的。如果您真的只想删除重复项,最好的选择是 Perl:

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

答案2

awk -F \| '{if ($2 != 05408736032) print}'

答案3

纯 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

答案4

您是否想删除第二个 | 分隔字段包含“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 $!;

相关内容