Unix 调用awk命令内的循环时出错
片段内容如下: ar是我正在读取的数组,filename是我正在读取的文件的名称 该文件如下所示: 我试图做的是,接受用户的文件名,同时获取他想要显示的字段号,然后扫描文件并相应地生成输出 数组“ar”包含字段号,如1,2,3 输入如下: 现在根据我上面给出的输入,输出应该如下所示: 但每次我运行代码时,都会在for之后的“val”下显示一个语法错误 谁能指出错误吗#我是新来的#Unix 调用awk命令内的循环时出错,unix,awk,Unix,Awk,片段内容如下: ar是我正在读取的数组,filename是我正在读取的文件的名称 该文件如下所示: 我试图做的是,接受用户的文件名,同时获取他想要显示的字段号,然后扫描文件并相应地生成输出 数组“ar”包含字段号,如1,2,3 输入如下: 现在根据我上面给出的输入,输出应该如下所示: 但每次我运行代码时,都会在for之后的“val”下显示一个语法错误 谁能指出错误吗#我是新来的# 您的问题(awk不是shell)下的注释中解释了代码的问题,以下是解决方法: $ cat tst.sh echo -
您的问题(awk不是shell)下的注释中解释了代码的问题,以下是解决方法:
$ cat tst.sh
echo -n "Filename: "
read filename
echo -n "Data Fields? "
read fields
awk -v fields="$fields" 'BEGIN{n=split(fields,f)} {for (i=1; i<=n; i++) printf "%s%s", $(f[i]), (i<n?OFS:ORS)}' "$filename"
$ ./tst.sh
Filename: file
Data Fields? 2 3
Thomas Manager
Jason Developer
Sanjay Sysadmin
Nisha Manager
Randy DBA
$cat tst.sh
echo-n“文件名:”
读取文件名
echo-n“数据字段?”
读取字段
awk-v fields=“$fields””BEGIN{n=split(fields,f)}{for(i=1;iThat的awk脚本,而不是shell脚本。这与在shell脚本中放入Python脚本相同——它必须遵循Python语法,而不是shell语法;在这种情况下,代码需要使用awk语法(并且除非将shell变量传递到awk中,否则不能引用shell变量).BTW,请将您的错误粘贴为文本,而不是屏幕截图。屏幕截图不可搜索,在具有不同DPI的屏幕上可能呈现非常糟糕,无法复制和粘贴代码,如果您的问题是由隐藏字符或看起来相似的字符等引起的,则可能不明确。如果您提供了一个输入示例并希望输出换句话说,我们也许可以告诉您如何在根本不使用awk
的情况下解决您的问题……awk是一种不同的语言,不是shell规范的一部分——因此您应该在您的问题上使用awk标记。Vishal,ar
数组中包含了什么,以及您为什么认为需要awk来迭代它?非常感谢您的支持在您的帮助下,我理解了我的错误。但是我有一个查询,在语法中,n=split(fields,f),n存储了f的长度,其中包含被拆分的值。那么,这是内部发生的吗?我不知道您所说的“内部发生”
,对不起。split()
是一个返回值的函数,变量n
被设置为该值,仅此而已。它与n=7
没有什么不同。是的,这回答了我的问题。我只是想知道它返回什么。但非常感谢您解决了这个问题。
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000
$ sh awk_prac.sh
Filename: employee.txt
Data Fields: 2 3
Thomas Manager
Jason Developer
Sanjay Sysadmin
Nisha Manager
Randy DBA
awk: cmd. line:1: BEGIN{OFS = "--"} {for val in "${ar[@]}" printf $val }
awk: cmd. line:1: ^ syntax error
$ cat tst.sh
echo -n "Filename: "
read filename
echo -n "Data Fields? "
read fields
awk -v fields="$fields" 'BEGIN{n=split(fields,f)} {for (i=1; i<=n; i++) printf "%s%s", $(f[i]), (i<n?OFS:ORS)}' "$filename"
$ ./tst.sh
Filename: file
Data Fields? 2 3
Thomas Manager
Jason Developer
Sanjay Sysadmin
Nisha Manager
Randy DBA