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进行多字符测试)。事实上,我想得到这个职位。我编辑我的帖子是为了解释我到底想要什么。谢谢你的帮助。事实上,我想得到这个职位。我编辑帖子是为了解释我到底想要什么。谢谢你的帮助