我有以下文件:
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
答案 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