希望从用户输入的“ 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
在循环中设置的内容。但是,它在循环中未使用,因此循环实际上并没有做很多事情。i
awk脚本中的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] 删除。
我来说两句