在脚本中awk设置命令行选项

时间:2019-12-01 06:41:24

标签: awk

我很好奇如何在awk脚本中设置命令行选项,例如-F作为字段分隔符。我试着像这样写shebang行

#!/usr/bin/awk -F ":" -f

并出现以下错误:

awk: 1: unexpected character '.'

在此示例中,我可以使用

BEGIN {FS=":"}

但是我仍然想知道一种设置所有这些选项的方法。预先感谢。

编辑:

让我们使用另一个易于测试的示例。 输入文件:

1
2
3
4

test.awk:

#!/usr/bin/awk -d -f
{num += $1}
END { print num}

运行

/usr/bin/awk -d -f test.awk inputfile

将得到10并生成一个名为awkvars.out的文件,其中包含一些awk全局变量。 但是

./test.awk inputfile

将会得到

awk: cmd. line:1: ./test.awk
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: ./test.awk
awk: cmd. line:1:   ^ unterminated regexp

如果我从shebang行中删除了“ -d”,

./test.awk inputfile

通常会输出10。

我的问题是,是否可以在test.awk文件中写入“ -d”以生成awkvars.out文件?

3 个答案:

答案 0 :(得分:0)

让我们说以下是我们的Input_file,我们将在这里将其用于所有提及的解决方案。

Task of the day


设置字段分隔符的第一种方法: 第一种简单方法是在Sub TEST() Dim StartColumn, EndColumn As Long Dim NextColumn As Long ActiveSheet.cells(1, 1).Select Do StartColumn = ActiveCell.Column EndColumn = Selection.Columns.Count + StartColumn - 1 NextColumn = EndColumn + 1 Debug.Print StartColumn; " - " & EndColumn ActiveSheet.cells(1, NextColumn).Select Loop While ActiveCell.value <> "" ActiveSheet.cells(1, 1).Select End Sub 程序的cat Input_file a,b,c,d ab,c 部分中设置FS的值文件。以下是我们的BEGIN文件。

awk

现在,当我们运行代码时,输​​出如下:

.awk


第二种设置字段分隔符的方法: 第二种方法将是在读取Input_file之前传递cat file1.awk BEGIN{ FS="," } { print $1"..."$2 } 值,如下所示。

/usr/local/bin/awk -f file1.awk Input_file
a...b
ab...c

示例: 现在是具有FS代码的/usr/local/bin/awk -f file.awk FS="," Input_file 文件。

file.awk

现在,当我们使用awk命令运行cat file.awk { print $1".."$2 } 文件时,将得到以下结果。

awk

这意味着它正在上述程序中以awk -f ..的形式使用字段分隔符。



设置字段分隔符的第三种方式: 我们可以在/usr/local/bin/awk -f file.awk FS="," Input_file a..b ab..c 程序中设置字段分隔符,就像我们使用{ {1}}选项如下。

,


设置字段分隔符的第四种方式: 我们可以在运行awk -f时通过在命令行上使用awk选项将字段分隔符作为变量提及脚本如下。

-F','

答案 1 :(得分:0)

请不要使用shebang来调用awk,因为它使您无法在调用awk之前将shell参数分成awk参数和awk变量,并在shell中做其他更好的事情(例如,用getopts进行arg解析)。只需从您的Shell脚本内部调用awk。

此外,不要命名您的Shell脚本test.awk,因为它是Shell脚本。它在awk中实现的事实是无关紧要的。没有理由创建一个有时被称为awk file的文件来进行awk解释,而有时又被称为file来进行外壳程序的解释。

答案 2 :(得分:0)

除了FS的设置外,还回答了OP问题。

简短的回答:您不能将多个选项与'#!'一起使用,并且由于您需要告诉awk从stdin(-f-)读取程序,所以您很不走运。

详细答案:

使用shebang(#!)时,单个参数有一个限制(作为第一个参数传递给命名程序。因此通常:

#! /path/to/prog arg1
input-1
input-2

将执行/path/to/prog arg1,并将文件内容(包括开头的shebang)作为stdin提供。 这过于简单,实际规则更加复杂。,请参见https://unix.stackexchange.com/questions/87560/does-the-shebang-determine-the-shell-which-runs-the-script

鉴于一个参数的这种局限性,在执行awk时,唯一有效且必需的参数是“ -f”,这表明awk程序在STDIN上提供。您可以添加一些其他不带任何参数的选项,例如'traditional'(例如,'-Pf-'将强制POSIX行为)。

据我所知,所有“有趣的”选项(设置FS,RS,ORS等)都需要与“ -f-”分隔开一个空格,从而无法将它们嵌入命令行,然后在脚本中使用'BEGIN {...}'或类似的命令。

底线尝试#! /usr/bin/awk -f- -F,将尝试查找与awk -f' -F'相同的程序,并将查找名为'--F'的文件。通常不是很有用,并且不会设置FS。