Awk 查找文件中单词的行号

Awk 查找文件中单词的行号,awk,grep,find,line,word,Awk,Grep,Find,Line,Word,我有一个文件:file.txt,其中包含以下数据。GNU grep版本:2.5.1,系统管理员拒绝将其升级到更高版本,因为这可能会影响生产 This is a file, my name is Karl, what is this process, karl is karl junior, file is a test file, file's name is file.txt My name is not Karl, my name is Karl Joey What is your name

我有一个文件:file.txt,其中包含以下数据。GNU grep版本:2.5.1,系统管理员拒绝将其升级到更高版本,因为这可能会影响生产

This is a file, my name is Karl, what is this process, karl is karl junior, file is a test file, file's name is file.txt
My name is not Karl, my name is Karl Joey
What is your name?
Do you know your name and what it is?
当我运行以下命令以使用以下命令获取该文件中单词“is”的第#行时,它会给出如下输出:

$grep-now“is”file.txt

1:is
is
is
is
is
is
2:is
is
3:is
4:is
我可以运行什么命令来获得以下输出:

1:is
1:is
1:is
1:is
1:is
1:is
2:is
2:is
3:is
4:is

is:1,1,1,1,1
is:2,2
is:3
is:4
如果我尝试下面的命令,我就接近了,但是我想用is和is替换1(逗号分隔)
grep-now“是”file.txt | tr'\012''sed“s/([0-9]:)/\n\1/g“| grep”。


似乎可以在我的系统上运行。

如果您可以升级您的
grep
版本,它应该会修复它:

#grep--版本
grep(GNU grep)2.16
版权所有(C)2014免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本。
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。
由Mike Haertel和其他人撰写,请参见。
#grep-现在是文件
1:是吗
1:是吗
1:是吗
1:是吗
1:是吗
1:是吗
2:是吗
2:是吗
3:是吗
4:是吗
使用
perl
模拟
grep
的输出:

#perl-lne'$x=“is”$c=()=/\b$x\b/g;而($c--){print“$:$x”;}文件
1:是吗
1:是吗
1:是吗
1:是吗
1:是吗
1:是吗
2:是吗
2:是吗
3:是吗
4:是吗
另一个:

#perl-lne'$x=“is”$c=()=/\b$x\b/g;下一步除非$c--$t=“${x}:$”$t.=“,$”,而($c-);打印$t'文件
is:1,1,1,1,1,1
is:2,1
is:3
is:4

如果您可以使用
perl
,那么下面是使用它们的and:

基于OP请求的新格式:

perl -lne '
    $found =()= /\bis\b/g;
    print substr($_, $-[0], $+[0] - $-[0]), ":", join (",", ($.) x $found);
' file
is:1,1,1,1,1,1
is:2,2
is:3
is:4
对单词边界使用GNU
awk

gawk '{
    n = gsub(/\<is\>/,"");
    printf "%s:", "is"; 
    for (i=1; i<=n; i++) printf "%s%s", NR, (i==n?RS:",")
}' file
is:1,1,1,1,1,1
is:2,2
is:3
is:4

这行不通。在第一行写一个新句子,可以写:我不喜欢西亚斯。然后它会打印:5:is。。这就是为什么我使用“-now”选项(参见-w)。Grep版本是:2.5.1我认为我们的系统管理员不会升级Grep。还有别的办法吗。谢谢。谢谢。我想升级就行了。实际上我不想创建任何变量,否则,它将是shell中的两行程序。非常感谢您的深思熟虑,是否可以只使用sed和awk或任何Linux命令(在新的格式输出上)而不是使用Perl来完成此操作?@user1513848使用
awk
更为神秘。也许您需要GNU awk来减少它的神秘性。awk解决方案是由单词分隔符
\
提供的特定于gawk的解决方案。由于OP无法安装更新的
grep
,我猜他没有
gawk
。虽然他显然有perl,但谁知道呢…@EdMorton Yea已经更新了答案以反映这一点。你是对的,在这之后有另一个问题,其中包括一个奇怪的格式化请求<代码>:)是的,我看到了。他现在似乎想要立即产生产出,而不是产生他最初想要但现在似乎不想要的产出,然后将其转换为他现在想要的产出,这会更容易。毫无意义。哦,好吧……供你参考,如果你喜欢,你可以用code(^[^[:alpha:]])替换
\([^[:alpha:]].$)
替换code\>,添加一个非呆滞版本。@EdMorton好主意,考虑到这是一个公认的解决方案,它可能会帮助其他人寻找一个普通的
awk
解决方案。谢谢,我已经添加了那个版本<代码>:)
perl -lne '
while ($_ =~ /\bis\b/g) {
    print "$.:", substr($_, $-[0], $+[0] - $-[0]);
}' file
1:is
1:is
1:is
1:is
1:is
1:is
2:is
2:is
3:is
4:is
perl -lne '
    $found =()= /\bis\b/g;
    print substr($_, $-[0], $+[0] - $-[0]), ":", join (",", ($.) x $found);
' file
is:1,1,1,1,1,1
is:2,2
is:3
is:4
gawk '{
    n = gsub(/\<is\>/,"");
    printf "%s:", "is"; 
    for (i=1; i<=n; i++) printf "%s%s", NR, (i==n?RS:",")
}' file
is:1,1,1,1,1,1
is:2,2
is:3
is:4
awk '
{
    n = gsub(/(^|[^[:alpha:]])is([^[:alpha:]]|$)/,"");
    printf "%s:", "is";
    for (i=1; i<=n; i++) printf "%s%s", NR, (i==n?RS:",")
}' file
is:1,1,1,1,1,1
is:2,2
is:3
is:4