Awk脚本:如何防止ARGV被视为输入文件名

Ala*_*ain 3 awk

看来,awk脚本考虑ARGV[1]ARGV[ARGC]作为输入文件.

有没有办法让awk考虑ARGV作为简单的参数而不是输入文件

例:

test.awk

#!/usr/bin/awk -f
BEGIN {title=ARGV[2]}
{if ($1=="AA") {print title}}
Run Code Online (Sandbox Code Playgroud)

dat文件

AB
BA
AA
CC

$ test.awk dat 'My Interesting Title'
Run Code Online (Sandbox Code Playgroud)

我有趣的标题awk:test.awk:3:致命:无法打开文件"我有趣的标题"进行阅读(没有这样的文件或目录)

Gil*_*il' 7

您可以随时修改ARGV.Awk ARGV依次处理元素,因此如果您在处理过程中修改它们,您可以安排读取不同的文件或不将某些参数视为文件名.特别是,如果你ARGVBEGIN块中修改,一切皆有可能.例如,即使传递了参数,以下代码段也会导致awk从标准输入读取,并将参数保存在名为的数组中args:

awk '
    BEGIN {for (i in ARGV) {args[i] = ARGV[i]; delete ARGV[i]}}
    …
' hello world
Run Code Online (Sandbox Code Playgroud)

如果您只想跳过第一个参数,请仅删除它:

awk '
    BEGIN {title = ARGV[1]; delete ARGV[1]}
    $1 == "AA" {print title}
' 'My Interesting Title' input.txt
Run Code Online (Sandbox Code Playgroud)

然而,这是不寻常的,因此可能被认为难以维护.考虑使用shell包装器并将标题传递给环境变量.

#!/bin/sh
title=$1; shift
awk '
    $1 == "AA" {print ENV["title"]}
' "$@"
Run Code Online (Sandbox Code Playgroud)

您还可以将字符串作为awk变量传递.请注意,该值经历了反斜杠扩展.

awk -v 'title=My Interesting Title\nThis is a subtitle' '
    $1 == "AA" {print title}  # prints two lines!
' input.txt
Run Code Online (Sandbox Code Playgroud)


Fre*_*ihl 5

像这样的东西?

$ awk -v title='My Interesting Title' '$0 ~ /AA/ {print title}1' input
AB
BA
My Interesting Title
AA
CC
Run Code Online (Sandbox Code Playgroud)