AWK / bash如何在AWK中包含文件名

时间:2012-04-22 15:21:26

标签: linux bash shell awk

我有以下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 " "  }

'

在上面的代码中,我试图包含该文件,但它不起作用?

3 个答案:

答案 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?

您提供的问题越详细,回复中的详细信息就越准确。