Unix 调用awk命令内的循环时出错

Unix 调用awk命令内的循环时出错,unix,awk,Unix,Awk,片段内容如下: ar是我正在读取的数组,filename是我正在读取的文件的名称 该文件如下所示: 我试图做的是,接受用户的文件名,同时获取他想要显示的字段号,然后扫描文件并相应地生成输出 数组“ar”包含字段号,如1,2,3 输入如下: 现在根据我上面给出的输入,输出应该如下所示: 但每次我运行代码时,都会在for之后的“val”下显示一个语法错误 谁能指出错误吗#我是新来的# 您的问题(awk不是shell)下的注释中解释了代码的问题,以下是解决方法: $ cat tst.sh echo -

片段内容如下:

ar是我正在读取的数组,filename是我正在读取的文件的名称

该文件如下所示:

我试图做的是,接受用户的文件名,同时获取他想要显示的字段号,然后扫描文件并相应地生成输出

数组“ar”包含字段号,如1,2,3

输入如下:

现在根据我上面给出的输入,输出应该如下所示:

但每次我运行代码时,都会在for之后的“val”下显示一个语法错误

谁能指出错误吗#我是新来的#


您的问题(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