0

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

'

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

4

3 回答 3

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"这样您就可以正确处理带有空格的文件名。

于 2012-04-22T15:35:08.220 回答
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 脚本中提供实际文件名?

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

于 2012-04-23T01:53:14.287 回答
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"
于 2012-04-22T15:31:22.577 回答