这是我提升的数字向量(它被称为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
时,我只是在这个特定实例中没有得到任何输出。有人可以告诉我为什么吗?
答案 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会话中的外观截图,包括我的自定义(以及一个突出显示相关文件属性的红色框):