替代匹配函数perl

时间:2015-08-03 13:39:21

标签: bash perl awk

我有一个文件,每行都有一个数字。

1
7
9
15
22
29
30
30  <--
30  <--
30  <--
40
42
49
50
50  <--
50  <--
55

我不能允许数字出现多次。如果找到重复项,则应将其替换为下一个未使用的数字。

1
7
9
15
22
29
30
31  <--
32  <--
33  <--
40
42
49
50
51  <--
52  <--
55

如果我将表格中的列添加到perl,awk sed bash脚本......我怎么能想出那个解决方案呢?任何想法都会很棒......

2 个答案:

答案 0 :(得分:2)

这是一个bash 4解决方案,问题是bash没有内置的排序。

修改 试图遵循评论,这可能是必要的吗?

declare -A assoc
while read key
do
    while [[ -n ${assoc[$key]} ]]
    do
        (( key++ ))
    done  

    assoc[$key]=1

done < vector.txt

oldIFS="$IFS"
IFS=$'\n'
echo "${!assoc[*]}" | sort -n > out.txt
IFS="$oldIFS"

vector.txt的内容:

1
7
9
15
22
29
30
30
30
30
40
42
49
50
50
50
55

out.txt的内容:

1
7
9
15
22
29
30
31
32
33
40
42
49
50
51
52
55

Perl解决方案做同样的事情:

use strict;
use warnings;

my %assoc;
my $fname = 'vector.txt';

open(my $in, $fname) or die "Unable to open '$fname': $!";
while (my $key = <$in>) {

    chomp($key);
    $key++ while exists $assoc{$key};
    $assoc{$key} = undef;

}
close $in;

my @output = sort {$a <=> $b} keys(%assoc);
local $" = "\n";
open(my $out, '>', 'out.txt') or die "Unable to open 'out.txt': $!";
print $out "@output\n";
close $out;

答案 1 :(得分:1)

在R:

中使用unique
       def requestData = [foo:bar]
       http.request(POST, ContentType.JSON) {
            headers.'Content-Type' = 'application/json'
            body = (requestData as JSON).toString()
            response.success = { resp, reader ->
                println("Success")
                jsonReponse = reader.text
            }
            response.failure = { resp, reader ->
                println("Failed, status: " + resp.status)
                jsonReponse = reader.text
            }
        }

或者在perl脚本中,使用哈希:

> v<-c(1,7,9,15,22,29,30,30,30,30,40,42,49,50,50,50,55)
> unique(v)

[1]  1  7  9 15 22 29 30 40 42 49 50 55