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

awk:从文件中获取条目并在其中添加值,awk,Awk,我有以下文件: 2 some 5 some 8 some 10 thing 15 thing 19 thing 现在我想以条目结束,其中“some”2,5,8对应于有1的行,其他的都是0。有多少行并不重要。这意味着“某些人”: 至于“东西” 使用awk可以快速实现这一点吗?我的意思是说: awk '{for(i=1;i<=10;i++) entries[$i]=0 for(f=0;<=NF;f++) entries[$f]=1

我有以下文件:

2    some    
5    some     
8    some    
10   thing
15   thing
19   thing
现在我想以条目结束,其中“some”2,5,8对应于有1的行,其他的都是0。有多少行并不重要。这意味着“某些人”:

至于“东西”

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

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

awk'{for(i=1;i类似的东西似乎可以产生“一些”数据:

$cat文件1
2一些
5一些
8一些
十件事
15件事
19件事

$awk'max类似的东西似乎可以产生“一些”数据:

$cat文件1
2一些
5一些
8一些
十件事
15件事
19件事
$awk'maxperl:

perl:


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

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

awk-vkey='thing'$2==key{while(++c另一个
awk
,输出以最后一个索引终止

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

awk-v key='thing'$2==key{while(++cSo)您想创建一个名为“some”的文件,其中的行是“0”或“1”,第2、5和8行是“1”,这差不多是对的。尽管它不必命名为“some”。但是第二列应该与1列匹配,所以您想创建一个名为“some”的文件,其中的行是“0”或“1”,第2行、第5行和第8行是“1”,大致正确。虽然它不必命名为“some”。但是第二列应该与1匹配。您应该使用
awk-v word=“thing”将单词传递给awk
并与
$2==word
进行比较——这将使shell上的参数化更容易side@glennjackman是的,可以。谢谢你指出。最后看起来很简单。谢谢你。你应该用
awk-v word=“thing”将单词传递给awk
并与
$2==word
进行比较——这将使shell上的参数化更容易side@glennjackman是的,可以做到。谢谢你指出。最后看起来很简单。谢谢。我没有用perl做太多,但这看起来很好。谢谢你没有用perl做太多,但这看起来很好。谢谢
$ cat file1
2    some
5    some
8    some
10   thing
15   thing
19   thing

$ awk 'max<$1 && $2=="some"{max=$1;b[$1]=1}END{for (i=1;i<=max;i++) print (i in b?1:0)}' file1
0
1
0
0
1
0
0
1
$ awk 'max<$1 && $2=="thing"{max=$1;b[$1]=1}END{for (i=1;i<=max;i++) print (i in b?1:0)}' file1
$ 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"
$ 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
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
awk -v key='thing' '$2==key{while(++c<$1) print 0; print 1}' file