【问题标题】:Compare consecutive rows and multiple columns in awk and random select one of duplicate lines比较awk中的连续行和多列并随机选择重复行之一
【发布时间】:2016-11-26 22:45:03
【问题描述】:

我读了这个问题:Compare consecutive rows in awk/(or python) and random select one of duplicate lines。 现在我有一些额外的问题: 如果我不仅要对 x 值进行比较,还要对 y 值或更多列进行比较,我应该如何更改代码? 也许像

if ($1 != prev) && ($2 != prev)  ???

换句话说:我想比较当前行的 x 值和 y 值是否与下一个连续行的 x 值和 y 值相同。

数据:

#x   y     z
1    1    11        
10   10   12       
10   10   17       
4    4    14
20   20   15        
20   88   16     
20   99   17
20   20   22
5    5    19
10   10   20

输出应如下所示:

#x   y     z
1    1    11        
10   10   17       
4    4    14
20   20   15        
20   88   16        
20   99   17    
20   20   22    
5    5    19
10   10   20

或(由于随机选择)

#x   y     z
1    1    11        
10   10   12       
4    4    14
20   20   15        
20   88   16        
20   99   17    
20   20   22    
5    5    19
10   10   20

来自上述链接的代码,用于 x 值,但不适用于 AND 条件中的 y 值:

$ cat tst.awk
function prtBuf(        idx) {
    if (cnt > 0) {
        idx = int((rand() * cnt) + 1)
        print buf[idx]
    }
    cnt = 0
}

BEGIN { srand() }
$1 != prev { prtBuf() }
{ buf[++cnt]=$0; prev=$1 }
END { prtBuf() }

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:

    应该这样做:

    function prtBuf(idx) {
        if (cnt > 0) {
            idx = int((rand() * cnt) + 1)
            print buf[idx]
        }
        cnt = 0
    }
    
    BEGIN { srand() }
    $1 != prev1 || $2 != prev2 { prtBuf() }
    { buf[++cnt]=$0; prev1=$1; prev2=$2 }
    END { prtBuf() }
    

    【讨论】:

    • 是的,就是这样!好工作!如果有人想对更多列进行此比较,也很容易更改。 3 列的示例: BEGIN { srand() } $1 != prev1 || $2 != prev2 || $3 != prev3 { prtBuf() } { buf[++cnt]=$0;上一页=$1;上一个=$2; prev3=$3 } END { prtBuf() }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    相关资源
    最近更新 更多