AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 66301
Accepted
user5967
user5967
Asked: 2009-09-18 07:51:28 +0800 CST2009-09-18 07:51:28 +0800 CST 2009-09-18 07:51:28 +0800 CST

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

  • 772

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

0009300|05408736032|89|01|001|0|0|0|1|NNNNNNNYNNNNNNNNNN|asdf|
0009367|05408736032|89|01|001|0|0|0|1|NNNNNNNYNNNNNNNNNN|adff|
unix-shell
  • 5 5 个回答
  • 6736 Views

5 个回答

  • Voted
  1. SergeyZh
    2009-09-18T08:22:32+08:002009-09-18T08:22:32+08:00
    awk -F \| '{if ($2 != 05408736032) print}'
    
    • 9
  2. Best Answer
    wallenborn
    2009-09-18T08:30:58+08:002009-09-18T08:30:58+08:00

    这可能会做你想要的:

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

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

    perl -ne '$a=(split "\\|")[1]; next if $h{$a}++; print;' foo.dat
    
    • 3
  3. Dennis Williamson
    2009-09-18T10:50:47+08:002009-09-18T10:50:47+08:00

    纯重击:

    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
    
    • 1
  4. Cian
    2009-09-18T08:19:19+08:002009-09-18T08:19:19+08:00

    是否要删除第二个 | 的所有行?分隔字段包含“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 $!;
    
    • 0
  5. pjz
    2009-09-18T08:20:14+08:002009-09-18T08:20:14+08:00

    您可以执行以下操作:

    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
    

    但是,像大多数 shell 脚本一样,它的效率很低。你最好用 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 $_;
      }
    }
    
    • 0

相关问题

  • 复制大量文件时出现“参数列表太长”错误

  • 动态压缩dd备份

  • 如何检查文件是否存在

  • 删除名称中带有连字符的 UNIX 目录

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve