删除一列中的重复并在第二列中迭代行以折叠

时间:2017-02-15 09:41:03

标签: python bash shell awk

我正在寻找一种方法来生成我的模型预测的一些统计数据。 在左边我有真正的价值观,在右边我有预测。 我的真实值超过了一个区间,因此我想将它们压缩为每个区间的单个值,并知道进行了哪些预测。 我想我需要做像" uniq"到第一列并迭代第二列的每一行,直到值在第一列中更改。 我认为awk会非常擅长使用$ 1和$ 2来处理列,但第二列的迭代不会丢失第一列中的信息就是我被困住的地方。值得注意的是,第一列中的值可以多次出现,我希望它们在每个间隔中重复,而不是按顺序重复。 我可以接受shell或python中的任何代码。

示例输入:

1   1
1   0
1   1
2   2
2   2
1   1
3   3
3   3
3   2
3   3
2   3
2   2
2   1

示例输出:

1   1 0 1
2   2 2
1   1
3   3 3 2 3
2   3 2 1

2 个答案:

答案 0 :(得分:1)

使用awk非常简单:

awk 'NR>1{cr="\n"}L!=$1{printf "%s%s ",cr,$1;L=$1}{printf " %s" ,$2}END{print ""}' input

<强>结果

1  1 0 1 
2  2 2 
1  1 
3  3 3 2 3 
2  3 2 1

<强>解释

NR>1{cr="\n"}cr回车:将 null ,直到处理完第一条记录(NR>1)。< / p>

L!=$1{printf "%s%s ",cr,$1;L=$1}:如果L 上一个键与当前($1)不同,则会打印 cr (首先为空记录)当前密钥$1,并将其值存储在L中作为最后一个密钥处理。

{printf " %s" ,$2}:只需显示每条记录的第二列

END{print ""}:处理完所有记录后,打印最终回车

答案 1 :(得分:1)

这是bash中的一个版本:

#/bin/bash
while read a b; do
    if [ $a != "$val" ]; then
        [ -n "$val" ] && echo $val $pred
        val=$a
        pred=$b
    else
        pred="$pred $b"
    fi
done <inputfile
[ -n "$val" ] && echo $val $pred