我想删除第二列为 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 $!;