Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash AWK多字段分隔符和变量_Bash_Shell_Awk_Field_Sh - Fatal编程技术网

Bash AWK多字段分隔符和变量

Bash AWK多字段分隔符和变量,bash,shell,awk,field,sh,Bash,Shell,Awk,Field,Sh,我试图在awk中使用从shell传入数字的字段以及最后四个字段执行计算 e、 我这样称呼我的shell脚本 ./myProgram myFile.txt 1 2 3 4 然后,在我的shell脚本中,我想使用awk来引用这样的文本文件中的字段,特别是最后四个字段$(NF-3)-$(NF) 所以我可以遍历字段,但是当我遍历时,因为有两种类型的字段分隔符,它似乎不起作用 到目前为止,我的shell脚本: #! /usr/bin/env bash file="$1" awk -F'[:,]' -

我试图在awk中使用从shell传入数字的字段以及最后四个字段执行计算

e、 我这样称呼我的shell脚本

./myProgram myFile.txt 1 2 3 4
然后,在我的shell脚本中,我想使用
awk
来引用这样的文本文件中的字段,特别是最后四个字段$(NF-3)-$(NF)

所以我可以遍历字段,但是当我遍历时,因为有两种类型的字段分隔符,它似乎不起作用

到目前为止,我的shell脚本:

#! /usr/bin/env bash

file="$1"

awk -F'[:,]' -v u1=$5 -v v1=$6 -v u2=$7 -v v2=$8 \ '{ print "u1 =", $u1 }' $1
awk -F'[:,]' -v u1=$5 -v v1=$6 -v u2=$7 -v v2=$8 \ '{ print "v1 =", $v1 }' $1
awk -F'[:,]' -v u1=$5 -v v1=$6 -v u2=$7 -v v2=$8 \ '{ print "u2 =", $u2 }' $1
awk -F'[:,]' -v u1=$5 -v v1=$6 -v u2=$7 -v v2=$8 \ '{ print "v2 =", $v2 }' $1

echo "Argument #1 =" $2
echo "Argument #2 =" $3
echo "Argument #3 =" $4
echo "Argument #4 =" $5
这是我从终端获得的输出:

u1 = 1
u1 = 5
u1 = 9
u1 = 5
u1 = 1
v1 = awk: illegal field $(), name "v1"
 input record number 1, file database.txt
 source line number 1
u2 = awk: illegal field $(), name "u2"
 input record number 1, file database.txt
 source line number 1
v2 = awk: illegal field $(), name "v2"
 input record number 1, file database.txt
 source line number 1
Argument #1 = 1
Argument #2 = 2
Argument #3 = 3
Argument #4 = 4

在awk中使用
$N
时,它将检索字段
N
。您可以将其与向awk传递参数结合使用,就像访问shell变量中定义的字段号一样。主要问题似乎是您正在传递脚本中未设置的变量

在脚本调用示例中,您没有为要定义的位置参数
$6
及以上传递足够的参数。这就是导致错误消息看起来像
非法字段$()
,因为
v1
是一个空字符串,所以您试图获取一个没有数字的字段

NF
是awk中包含字段数量的特殊变量,因此要访问最后四个字段,可以使用
$(NF-3)
$(NF-2)
$(NF-1)
$NF

在awk命令之前有一个
\
,它没有做任何有用的事情,所以我也删除了它

代码中还有几个其他问题也值得一提。引用您的shell变量!这可以防止在更复杂的变量上出现分词问题。如果您的参数是没有空格的数字,这不会有任何区别,但也不会造成任何伤害,这是一个很好的实践。您已经定义了
文件
,因此我使用了它而不是
$1

结合这些变化,我们最终得出如下结论:

awk -F'[:,]' -v u1="$2" -v v1="$3" -v u2="$4" -v v2="$5" '{ print "u1 =", u1 }' "$file"
只有一行:

awk-F'[:,]'-vu1=$5-vv1=$6-vu2=$7-vv2=$8\'{print“u1=”,$u1}'$1

这里$5、$6、$7和$8是bash位置参数,而不是awk字段位置。 根据命令行,脚本中有5个参数:

/myProgram myFile.txt 1 2 3 4

$1 = myFile.txt
$2 = 1
$3 = 2
$4 = 3
$5 = 4
$6 = 
$7 =
$8 =
这就是为什么awk只在调用
$v1
时提醒您,因为它相当于
$
,而不是字段值

如果我正确理解您的问题,您希望得到最后4个参数与这些值匹配的行:

awk -F'[:,]' '{ print "u1=",$(NF-3),"v1=",$(NF-2),"u2=",$(NF-1),"v2=",$NF }' "$1"

NF是字段的数目,减去3,在结束前给出4个字段。

使用$来访问awk中的变量,不要这样做。当然,除非您打算这样做,否则在这种情况下,您可能应该在开始时设置变量的值。你有
u1=$5
但是你只给脚本传递了4个参数。这些反斜杠是干什么的?也不是100%,但我很确定在shebang之后留下一个空格会导致它不起作用。我去掉了反斜杠,谢谢。然而,当我从u1中取出$时,它会为每一行计算出u1=4。如果你想访问最后四个字段,为什么你要通过1234?这是任务的第二部分,但我确实感到困惑,因为我必须同时传递定位参数和访问字段,我认为如果我引用他们都使用$1-$9符号,所以我把它放在那里,以确保人们认为这样做是正确的。我将实际使用所有这些元素进行计算@JIDPlease编辑您的问题,以明确您想要做什么,并给出完整的示例。目前,我们正在猜测您的需求。当我更改它时,我得到了这个输出:u1=4U1=4U1=4U1=4U1=4V1=v1=v1=v1=v1=u2=u2=u2=u2=u2=v2=v2=v2=v2=v2=Argument#1=1=2=2=3=4=4@JoshuaVernon我补充了我的解释,希望这能澄清问题。@TomFenech我真的很想得到这些字段。那么我如何使用$N来获取字段呢。然后,我将使用每行的最后四个字段对四个位置字段进行计算parameters@JoshuaVernon将
$
添加回并使用
$(NF-3)
直到
$NF
访问最后四个字段?@JoshuaVernon最佳格式通常类似于1明确的问题陈述:“我试图使用从shell传入的数字字段以及最后四个字段在awk中执行计算”2您的数据示例(完成)3您的尝试(完成)4您遇到的问题(完成)。您应该删除“答案”“您的问题的一部分是为了使其更加简短并改进介绍。我希望获得txt文件中每行的最后四个字段,并将它们保存到变量中,以便我可以使用位置参数和每行的最后四个字段进行计算。我甚至无法得到最后四个参数来打印出来,看看我是否得到了它们correctly@JoshuaVernon我编辑以打印最后4个字段,如果您想在输出之前对它们进行处理,您必须在awk中工作,或者调用另一个脚本,将它们作为参数,如果没有真实的案例,很难猜测您想要做什么。@JoshuaVernon您意识到awk贯穿整个文件,所以您的变量可能包含每一行,也可能只包含最后一行?
awk -F'[:,]' '{ print "u1=",$(NF-3),"v1=",$(NF-2),"u2=",$(NF-1),"v2=",$NF }' "$1"