我有以下awk脚本:
#! /bin/awk -f
BEGIN { FS = ":" }
{ print $1 " " $2 " " $3 " " $4 " " }
我想用“#!/ bin / bash”编写一个bash脚本代码,但我需要在其中包含一个文件;当程序显示文件时。
#! /bin/bash
awk -f, '
FILENAME= $1
BEGIN { FS = ":" }
{ print $1 " " $2 " " $3 " " $4 " " }
'
在上面的代码中,我试图包含该文件,但它不起作用?
答案 0 :(得分:2)
目前还不清楚你想通过什么。你想要一个获取文件名作为值的变量吗?最简单的方法是使用-v var=value
:
#! /bin/bash
awk -v MYFILENAME="$1" '
BEGIN { FS = ":" }
{ print MYFILENAME " " $1 " " $2 " " $3 " " $4 " " }
'
请注意,FILENAME是保留变量,您无法设置它。
或者你想传递输入文件?在这种情况下,您只需将它们传递给程序,如:
#! /bin/bash
awk '
BEGIN { FS = ":" }
{ print MYFILENAME " " $1 " " $2 " " $3 " " $4 " " }
' "$1"
-f
选项是包含awk
脚本,顺便说一下。因此-f,
会要求AWK包含名为,
的文件。
在shell级别,请确保始终将变量括在"..."
中,如"$1"
所示,这样您就能正确处理带空格的文件名。
答案 1 :(得分:0)
我很难从问题中说出来,但我认为你想要的是
#!/usr/bin/env bash
awk -F, '
{
#do stuff
}' "$1"
这将在您传递给shell脚本的文件上运行awk。
但是,如果您希望在awk中更换脚本变量,则可以从文字字符串中转义以获取变量替换。例如:
#!/usr/bin/env bash
filename="$1"
awk -F, '
{
print "'"$filename"'"
}' "$1"
将打印出您传递的文件名,与文件中的行一样多。请注意,这将导致awk将所有这些变量视为文字字符串。所以这也可行:
#!/usr/bin/env bash
filename="$1"
awk -F, '
BEGIN {
awksFileName="'"$filename"'"
}
{
print awksFileName
}' "$1"
答案 2 :(得分:0)
您实际上不需要使用bash来提取文件名。
[ghoti@pc ~]$ cat text
one:two:three:four
cyan:yellow:magenta:black
[ghoti@pc ~]$ cat doit.awk
#!/usr/bin/awk -f
BEGIN { FS=":" }
{
printf("%s %s %s %s\n", $1, $2, $3, $4);
}
[ghoti@pc ~]$ ./doit.awk text
one two three four
cyan yellow magenta black
[ghoti@pc ~]$
但正如蒂姆所说,基于你在问题中所包含的内容,很难弄清楚你要找的结果。你真的需要在bash中运行你的awk脚本吗?您是否需要在awk脚本中使用实际文件NAME?
您提供的问题越详细,回复中的详细信息就越准确。