我很好奇如何在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文件?
答案 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。