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
    • 最新
    • 标签
主页 / unix / 问题 / 411800
Accepted
joshiricky
joshiricky
Asked: 2017-12-20 05:10:06 +0800 CST2017-12-20 05:10:06 +0800 CST 2017-12-20 05:10:06 +0800 CST

从乘法表示的第二个变量中提取具有最大值的行

  • 772

我有一个我似乎无法解决的问题。

我有一个巨大的制表符分隔的文本文件,类似于:

chr 10 20 20 a
chr 30 40 10 b
chr 30 40 15 b
chr 30 40 11 b

我需要的是:1)提取所有唯一行2)在第5列多次表示的情况下(例如b),第4列中具有最大值的行。

所以我在上面的例子中需要的行是:

chr 10 20 20 a (这是唯一的行) 
chr 30 40 15 b (这是当第 5 列被多次表示时,第 4 列中具有最大值的行。

有没有一种简单的方法可以做到这一点?

text-processing r
  • 4 4 个回答
  • 163 Views

4 个回答

  • Voted
  1. Best Answer
    ilkkachu
    2017-12-20T06:14:30+08:002017-12-20T06:14:30+08:00

    那么,按第五列对行进行分组,并为每一组打印第四列最大的行?

    假设您没有负数:

    $ awk '$4 > val[$5] {val[$5] = $4; line[$5] = $0} 
           END {for (x in line) print line[x] }' < foo.txt
    chr 10 20 20 a       
    chr 30 40 15 b
    
    • 1
  2. Praveen Kumar BS
    2017-12-20T05:45:54+08:002017-12-20T05:45:54+08:00

    例子.txt

    chr 10 20 20 a
    chr 30 40 10 b
    chr 30 40 15 b
    chr 30 40 11 b
    

    代码

     awk '$5== "a" {print $0}' l.txt | sort -k4 -nr | sed -n '1p' ; awk '$5=="b" {print $0}' l.txt | sort -k4  -nr | sed -n '1p'
    

    输出

    chr 10 20 20 a
    chr 30 40 15 b
    
    • 0
  3. glenn jackman
    2017-12-20T08:10:28+08:002017-12-20T08:10:28+08:00

    我会写:

    awk '
        NR == FNR {count[$5]++; if ($4 > max[$5]) max[$5] = $4; next} 
        count[$5] > 1 && $4 == max[$5] && !seen[$0]++
    ' file file
    
    chr 30 40 15 b
    

    处理文件两次:

    • 第一次,计算第 5 个字段出现的频率,并找到每个第 5 个字段值的最大第 4 个字段
    • 第二次,处理您的标准:
      • 仅记录第 5 个字段出现多次的情况,并且
      • 仅记录最大第 4 个字段,并且
      • 只有唯一的记录

    如果您想查看计数为 1 的行,那么我们可以简单地写

    awk 'NR == FNR {if ($4 > max[$5]) max[$5]=$4; next} $4==max[$5] && !seen[$0]++' file file
    
    chr 10 20 20 a
    chr 30 40 15 b
    
    • 0
  4. drl
    2017-12-20T08:14:12+08:002017-12-20T08:14:12+08:00

    这个片段:

    # Utility functions: print-as-echo, print-line-with-visual-space.
    pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
    pl() { pe;pe "-----" ;pe "$*"; }
    pl " Input data file $FILE:"
    head $FILE
    
    pl " Expected output:"
    cat $E
    
    pl " Results:"
    datamash -t" " --group=5 max 4 --full <$FILE |
    cut -d" " -f1-5
    

    产生:

    -----
     Input data file data1:
    chr 10 20 20 a
    chr 30 40 10 b
    chr 30 40 15 b
    chr 30 40 11 b
    
    -----
     Expected output:
    chr 10 20 20 a       
    chr 30 40 15 b
    
    -----
     Results:
    chr 10 20 20 a
    chr 30 40 15 b
    

    对于像这样的系统:

    OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64
    Distribution        : Debian 8.9 (jessie) 
    bash GNU bash 4.3.30
    datamash (GNU datamash) 1.2
    cut (GNU coreutils) 8.23
    

    datamash 的一些细节:

    datamash        command-line calculations (man)
    Path    : /usr/local/bin/datamash
    Version : 1.2
    Type    : ELF 64-bit LSB executable, x86-64, version 1 (SYS ...)
    Help    : probably available with -h,--help
    Home    : https://savannah.gnu.org/projects/datamash/ (pm)
    Home    : http://www.gnu.org/software/datamash (doc)
    
    • 0

相关问题

  • grep 从 $START 到 $END 的一组行并且在 $MIDDLE 中包含匹配项

  • 重新排列字母并比较两个单词

  • 在awk中的两行之间减去相同的列

  • 多行文件洗牌

  • 如何更改字符大小写(从小到大,反之亦然)?同时[重复]

Sidebar

Stats

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

    JSON数组使用jq来bash变量

    • 4 个回答
  • Marko Smith

    日期可以为 GMT 时区格式化当前时间吗?[复制]

    • 2 个回答
  • Marko Smith

    bash + 通过 bash 脚本从文件中读取变量和值

    • 4 个回答
  • Marko Smith

    如何复制目录并在同一命令中重命名它?

    • 4 个回答
  • Marko Smith

    ssh 连接。X11 连接因身份验证错误而被拒绝

    • 3 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Marko Smith

    systemctl 命令在 RHEL 6 中不起作用

    • 3 个回答
  • Marko Smith

    rsync 端口 22 和 873 使用

    • 2 个回答
  • Marko Smith

    以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

    • 1 个回答
  • Marko Smith

    jq 打印子对象中所有的键和值

    • 2 个回答
  • Martin Hope
    EHerman JSON数组使用jq来bash变量 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux 日期可以为 GMT 时区格式化当前时间吗?[复制] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC 如何复制目录并在同一命令中重命名它? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve “root”用户的文件权限如何工作? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey 如何下载软件包而不是使用 apt-get 命令安装它? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao 为什么目录 /home、/usr、/var 等都具有相同的 inode 编号 (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知] 2017-11-26 18:26:02 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve