【问题标题】:Removing repetitions in one column and iterate lines to collapse in second column删除一列中的重复项并迭代行以在第二列中折叠
【发布时间】:2017-02-15 09:41:03
【问题描述】:

我正在寻找一种方法来生成关于我的模型预测的一些统计信息。 左边我有真实的价值观,右边我有预测。 我的真实值在一个区间内,所以我想将它们浓缩为每个区间的单个值,并知道做出了哪些预测。 我想我需要对第一列执行类似“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

【问题讨论】:

  • 到目前为止你想到了什么?

标签: python bash shell awk


【解决方案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)。

L!=$1{printf "%s%s ",cr,$1;L=$1}:如果L Last key 与当前 ($1) 不同,它会打印 cr(第一条记录为 null)当前键 @ 987654330@,并将其值存储在L 中作为处理的最后一个键。

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

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

【讨论】:

  • 感谢您的精彩解释!像魅力一样工作。
【解决方案2】:

这是 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

【讨论】:

    猜你喜欢
    • 2012-08-16
    • 2020-09-17
    • 1970-01-01
    • 2017-02-09
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多