linux - awk 如何提取其他字段 "if duplicates in fields"仅当先前字段相同且大于零时

标签 linux shell scripting awk duplicates

我正在尝试查看制表符分隔文件中特定字段(第 1 列和第 4 列)的重复行,并从重复字段 block 的第一行和最后一行中提取特定列;仅当前面的字段相同并且值也大于 0 时。例如:

如果两列($1 和 $4)在不同位置相同且被其他列穿插,则需要将它们视为单独的 block

示例输入:

  1  tmp1   153446387   153446446   -0.2    1.0888042
  2  tmp1   153446925   153446973   0   0.87891006
  3  tmp1   153451902   153451951   1.43854 1.2709045
  4  tmp1   153454056   153454105   1.43854 1.4132746
  5  tmp1   153456192   153456250   1.43854 0.87553155
  6  tmp1   153458717   153458776   1.335858    1.1829022
  7  tmp1   153460782   153460841   1.335858    0.006651476
  8  tmp1   153462035   153462094   0   0.13484457
  9  tmp1   153463690   153463749   1.43854 0.45511296
 10  tmp1   153467589   153467673   1.43854 1.4431274
 11  tmp1   153467873   153468632   0.31841 1.70443
 12  tmp1   154451904   154451951   1.43854 1.3709045
 13  tmp1   154454054   154454109   1.43854 1.132746
 14  tmp1   154456194   154456259   1.43854 0.8553
 15  tmp2   153472147   153472194   1.43854 0.99288875
 16  tmp2   153476511   153476559   0   0.99288875

输出:

tmp1    153451902   153456250   1.43854
tmp1    153458717   153460841   1.335858
tmp1    153463690   153467673   1.43854
tmp1    154451904   154456259   1.43854
tmp2    153472147   153472194   1.43854

关于如何解决这个问题的任何想法

最佳答案

awk '
    BEGIN {OFS = FS = "\t"}
    function output(key, ary) {
        split(key, ary, FS)
        print ary[1], start, end, ary[2]
    }
    $4 <= 0 {next}
    key != $1 FS $4 {
        if (end) {output(key)}
        key = $1 FS $4
        start = $2
    }
    {end = $3}
    END {output(key)}
' filename

关于linux - awk 如何提取其他字段 "if duplicates in fields"仅当先前字段相同且大于零时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6945357/

相关文章:

java - OpenShift Maven 没有使用正确的 JAVA_HOME

python - 使用 subprocess.check_call() 运行 shell 命令时出错

shell - 使用 awk 或 sed 比较两个文件

c - fgets 错误消息循环 - C 中的 Linux shell

database - 在 Qlik Sense 数据加载脚本中的何处放置标记?

linux - 如何使 Linux 脚本将 "\"理解为 ' ' 以用于路径目的

linux - Visual Studio Code 未在 Linux 上缓存 git 密码

c - POSIX API 调用以列出进程中运行的所有 pthreads

linux - 打开与 ssh-s 注销的数量一样多的终端,并关闭 ssh-s 注销的终端

windows - 如何让 Windows 软件在脚本中以不同的用户身份运行?