Bash 获取单词在一行中的位置和长度

Bash 获取单词在一行中的位置和长度,bash,awk,Bash,Awk,我想把一行字分开,然后给出每行的长度和位置 for word in $line do start=`awk -v a="$Logline" -v b="$word" 'BEGIN{print index(a,b)}'` count=`echo $word|wc -m` echo $word : $start : $count done 那么让我们假设: 行='这是一个测试到测试' 我将获得: 此:0:4 is:5:2 a:8:1 测试:10:4 至:15:2 测

我想把一行字分开,然后给出每行的长度和位置

for word in $line 
do 
    start=`awk -v a="$Logline" -v b="$word" 'BEGIN{print index(a,b)}'` 
    count=`echo $word|wc -m` 
    echo $word : $start : $count
done
那么让我们假设:

行='这是一个测试到测试'

我将获得:

此:0:4

is:5:2

a:8:1

测试:10:4

至:15:2

测试:18:4


使用此解决方案,当两个单词相同时,问题就会出现。有人知道如何做到这一点?

如果单词之间只有一个空格,您可以:

pos=0
for word in $line
do
    length=`expr length "$word"`
    echo "$word : $pos : $length"
    pos=`expr $pos + 1`
done
$>echo "this test is a test" | sed 's/ / \n/g'| awk 'BEGIN{i=0}{print $1, ":", i, length($1);i+=length($0)}'
this : 0 4
test : 5 4
is : 10 2
a : 13 1
test : 15 4

如果单词之间只有一个空格,可以执行以下操作:

$>echo "this test is a test" | sed 's/ / \n/g'| awk 'BEGIN{i=0}{print $1, ":", i, length($1);i+=length($0)}'
this : 0 4
test : 5 4
is : 10 2
a : 13 1
test : 15 4

可能您正在尝试这样做:

$ cat file
Hi my name is jaypal
i am a software software test engineer
scripting in awk awk awk is my hobby

$awk'{for(i=1;i可能是您正在尝试这样做:

$ cat file
Hi my name is jaypal
i am a software software test engineer
scripting in awk awk awk is my hobby


$awk'{for(i=1;i至少,比如说,10行示例输入(包括您能想到的任何难以处理的情况)和预期输出,因为不清楚您要做什么以及您对“单词”的定义是的,
$line
真的是一个与
$Logline
不同的变量吗?还是一个打字错误?是的,很抱歉我编辑了我的帖子来添加更多的信息。我要求10行包含难以处理的案例,而你发布了一行小案例,其中是空格分隔的字母字符。来吧,花点精力思考一下这或您将得到一个解决方案,该解决方案将在第一个非平凡的行(例如,如果一行包含
here's
而不是
here is
-是
here's
一个单词还是是
here
s
单独的单词或……?)。谢谢你的建议,但我总是以琐碎的案例为例。我需要解析的所有文件都遵循相同的架构,这非常简单。例如,发布10行示例输入(包括你能想到的任何难以处理的案例)和预期输出,因为不清楚你在尝试做什么以及你对“单词”的定义是的,
$line
真的是一个与
$Logline
不同的变量吗?还是一个打字错误?是的,很抱歉我编辑了我的帖子来添加更多的信息。我要求10行包含难以处理的案例,而你发布了一行小案例,其中是空格分隔的字母字符。来吧,花点精力思考一下这或您将得到一个解决方案,该解决方案将在第一个非平凡的行(例如,如果一行包含
here's
而不是
here is
-是
here's
一个单词还是是
here
s
单独的单词或……?)。谢谢你的建议,但我总是以琐碎的案例为例。我需要解析的所有文件都遵循相同的体系结构,非常简单。这就是我需要的。谢谢:)我对你的解决方案有一个问题,我得到这个结果:这个:0 4。脚本在第一个单词后停止。我刚刚在我的终端中通过了你的解决方案。我在Mac{Maverick}上,我不知道这是否有区别。当我在我的终端中发送时:$>echo“这个测试是一个测试”| sed's/\n/g';输出:$>这个ntest是一个ntest。这很奇怪吗?不,这一点也不奇怪,因为只有一些sed会将
\n
解释为新行。在sed中获取新行的可移植方法是反斜杠后跟文字新行。只需先使用反斜杠,然后再使用新行-您编写的内容很幸运地被解释为一行你不需要sed+awk,整个过程可以写成
echo“这个测试是一个测试”| awk-v RS='[[:space:]''''{print$0,i+0,length;i+=(length+1)}'
(使用GNU-awk进行多字符测试)。这就是我需要的,谢谢:)我对你的解决方案有一个问题,我得到这个结果:这个:0 4。脚本在第一个单词后停止。我刚刚在我的终端中通过了你的解决方案。我在Mac{Maverick}上,我不知道这是否有区别。当我在我的终端中发送时:$>echo“这个测试是一个测试”| sed's/\n/g';输出:$>这个ntest是一个ntest。这很奇怪吗?不,这一点也不奇怪,因为只有一些sed会将
\n
解释为新行。在sed中获取新行的可移植方法是反斜杠后跟文字新行。只需先使用反斜杠,然后再使用新行-您编写的内容很幸运地被解释为一行你永远不需要sed+awk,整个过程可以写成
echo“这个测试是一个测试”| awk-v RS='[[:space:]'''{print$0,i+0,length;i+=(length+1)}'
(使用GNU awk进行多字符测试)。事实上,我想得到这个职位。我编辑我的帖子是为了解释我到底想要什么。谢谢你的帮助。事实上,我想得到这个职位。我编辑帖子是为了解释我到底想要什么。谢谢你的帮助