在字符串中定位子字符串位置

骗子

希望从用户输入的“ schemas.txt”文件中提取第三个字段的位置

schemas="schemas.txt"
for i in ${schemas[@]};
do
    awk '{for(i=1;i<=NF;i++)if($i=="$3")print i}'
done 

关于我为何陷入无限循环的任何想法?

编辑:下面添加了一个示例。

在schemas.txt中,第二行是“人的身高体重年龄种族职业”

假设用户输入“ age”作为他们的第三个参数,我希望对其进行解析,并返回“ 4”,因为它是字符串中的第四个单词。

伊尔卡楚

如果我的意图正确,那么我认为您不需要shell循环。而是给awk指定要在命令行上读取的文件的名称。我们可以通过传递关键字来查找-v,它从命令行设置awk变量。

因此,对于包含“年龄”的每一行,这将在其出现的位置打印字段号:

$ cat schemas.txt
People height weight age race occupation
age is first on this line
$ keyword=age
$ awk -vk="$keyword" '{ for (i = 1 ; i <= NF ; i++) if($i == k) print i }' schemas.txt 
4
1

当然,fixed关键字仅作为示例,您可以使用awk -vk="$3",并跳过多余的变量。

通常,打印行号看起来也很有用,您可以使用它来进行打印print NR, i


这里,

schemas="schemas.txt"
for i in ${schemas[@]};
do
    awk '{for(i=1;i<=NF;i++)if($i=="$3")print i}'
done 

schemas只包含schemas.txt,因此这就是shell变量i在循环中设置的内容。但是,它在循环中未使用,因此循环实际上并没有做很多事情。iawk脚本中in独立于shell i

awk似乎挂在这里,因为默认情况下它从stdin读取。此外,"$3"shell不会在单引号内对其进行扩展,因此awk会寻找一个字面包含的字段$3

循环对于多个文件更有意义:

files=(file1.txt file2.txt)
for file in "${files[@]}"; do
    awk '{...}' "$file"
done

但是即使这样,您也可以一次性将所有文件传递给awk:

awk '{...}' "${files[@]}"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章