awk:从文件中获取条目并在其间添加值

时间:2017-12-05 22:35:38

标签: awk

我有以下文件:

2    some    
5    some     
8    some    
10   thing
15   thing
19   thing

现在我想最终得到条目,其中“some”2,5,8对应于有1的行,其他一切都是0.无论有多少行都无关紧要。这意味着“一些”:

0
1
0
0
1
0
0
1
0
0

和“thing”

0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
1
0

使用awk可以快速实现吗?我的意思是:

awk '{for(i=1;i<=10;i++) entries[$i]=0 for(f=0;<=NF;f++) entries[$f]=1' testfile.txt

3 个答案:

答案 0 :(得分:2)

这样的事情似乎有助于产生&#34;一些&#34;数据:

$ awk 'max<$1 && $2=="thing"{max=$1;b[$1]=1}END{for (i=1;i<=max;i++) print (i in b?1:0)}' file1

同样,这个适用于&#34;事物&#34;数据

$ awk -v word="some" 'max<$1 && $2==word{max=$1;b[$1]=1}END{for (i=1;i<=max;i++) print (i in b?1:0)}' file1
# for thing just apply awk -v word="thing"

另外,正如glennjackman在评论中所提到的,我们可以使用外部变量来选择某些东西:

$ w="some" #selectable / set by shell , by script , etc
$ awk -v word="$w" 'max<$1 && $2==word{max=$1;b[$1]=1}END{for (i=1;i<=max;i++) print (i in b?1:0)}' file1

使用像这样的awk变量可以实现更好的参数化:

{{1}}

答案 1 :(得分:2)

另一个awk,输出以最后一个索引

结束
awk -v key='thing' '$2==key{while(++c<$1) print 0; print 1}' file

在最后1之后添加一些额外的0;添加END{while(i++<3) print 0}

答案 2 :(得分:1)

perl的:

perl -lanE '
        push @{$idx{$F[1]}}, $F[0] - 1;  # subtract 1 because we are working with 
                                          # (zero-based) array indices
        $max = $F[0];     # I assume the input is sorted by column 1
    } END {
        $, = "\n";
        for $word (keys %idx) {
            # create a $max-sized array filled with zeroes
            @a = (0) x $max;
            # then, populate the entries which should be 1
            @a[ @{$idx{$word}} ] = (1) x @{$idx{$word}};

            say $word, @a;
        }
' file |  pr -2T -s | nl -v0
 0  thing   some
 1  0       0
 2  0       1
 3  0       0
 4  0       0
 5  0       1
 6  0       0
 7  0       0
 8  0       1
 9  0       0
10  1       0
11  0       0
12  0       0
13  0       0
14  0       0
15  1       0
16  0       0
17  0       0
18  0       0
19  1       0