使用bash转换数字序列

时间:2015-07-05 18:36:20

标签: r bash shell

这是我提升的数字向量(它被称为t8_

2 7 8 9 11 15 34 91 91 92 94

问题是有些数字会发生两次 - 我不想删除它们但是它们必须变成两个唯一且不是浮点数的数字。所以我开始考虑迭代向量

下一个矢量将是

2 7 8 9 11 15 34 91 92 92 94

然后再次进行同样的过程

当向量为

2 7 8 9 11 15 34 91 92 93 94

对于这个例子,这是有效的

#!/bin/bash

while read -a vec; do
        # INT_MIN for bash: 32-bit bash also supports 64-bit integers.
        min=$((-1<<63)) 
        for ((i = 0; i < ${#vec[@]}; i++)); do
                (( min = vec[i] = vec[i] > min ? vec[i] : min + 1 ))
        done
        echo "${vec[@]}"
done
###

问题在于它不适用于我的真实矢量,它看起来像https://www.dropbox.com/s/vp67eiw4ns9rr07/num?dl=0

当我un.sh < vec时,我只是在这个特定实例中没有得到任何输出。有人可以告诉我为什么吗?

3 个答案:

答案 0 :(得分:4)

我无法解释为什么您的shell代码不适合您,但我可以为您提供适用于您的数据的Perl解决方案

$this->CI->lang->load('form_validation');

答案 1 :(得分:3)

使用awk

tr ' '  '\n' <file | awk '{ if(old >= $1) $1 = old + 1; old = $1 } 1' | tr '\n' ' '

这假设您的号码不会溢出awk的(已签名)整数。

第一个tr会将您的序列从长行更改为列。第二个将它改回来。

答案 2 :(得分:2)

您的代码 对您的真实矢量起作用。它只适用于您的文件num。原因是您的文件num没有行结束,而read只在行结束后处理一行。 [编辑:rici的好点(在评论中):read实际上确实正确处理了行,它只是因缺少行结束而生成非零退出状态,因此{{1}没有为该行执行body。]

我通过将文件复制到while,在vim中编辑副本,然后运行num-with-eol然后:set nobin eol,将其修复到本地计算机上。然后,我可以将您的代码作为单行运行来生成所需的输出,如下所示:

:wq

以下是这三个文件在vim会话中的外观截图,包括我的自定义(以及一个突出显示相关文件属性的红色框):

vim