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