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

2024-03-04

看来 awk 脚本考虑了ARGV[1] to ARGV[ARGC]作为输入文件。

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

Example:

test.awk

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

dat file

AB
BA
AA
CC

$ test.awk dat 'My Interesting Title'

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


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

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

如果您只想跳过第一个参数,只需将其删除:

awk '
    BEGIN {title = ARGV[1]; delete ARGV[1]}
    $1 == "AA" {print title}
' 'My Interesting Title' input.txt

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

#!/bin/sh
title=$1; shift
awk '
    $1 == "AA" {print ENV["title"]}
' "$@"

您还可以将字符串作为 awk 变量传递。请注意该值会进行反斜杠扩展。

awk -v 'title=My Interesting Title\nThis is a subtitle' '
    $1 == "AA" {print title}  # prints two lines!
' input.txt
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

awk 脚本:如何防止 ARGV 被视为输入文件名 的相关文章

  • 将 awk 输出保存到变量 [重复]

    这个问题在这里已经有答案了 谁能帮我解决这个问题吗 我正在尝试将 awk 输出保存到变量中 variable ps ef grep port 10 grep v grep port 10 awk printf s 12 printf var
  • 使用 awk 打印匹配键的列范围

    这似乎有一个简单的解决方案 但我被困住了 我想在密钥文件中查找主文件的第二列 对于任何匹配的密钥 仅打印前两列 但打印其余的整个记录 我有一个工作脚本 但它打印匹配键的整行 你能帮忙吗 awk FNR NR key 1 next 2 in
  • 使用 awk 读取串行输入,插入日期

    我正在尝试重新格式化串行输入 该输入由两个用逗号分隔的整数组成 从 Arduino 发送 1 2 3 4 0 0 0 1 我想在每行后面附加日期 用制表符分隔所有内容 到目前为止 这是我的代码 cat dev cu usbmodem3d11
  • awk 求和多列

    如何计算所有单独列 115 列 的总和 输入 txt 1st 2nd 3rd 4th 5th Till 115thColumn 51 34 27 67 88 99 56 39 32 72 93 104 66 49 42 82 103 114
  • 使用 awk 对单独行上的多个字段进行数学运算

    我一直在对 3 字段 x 2 行文件进行一些数学运算 如下所示 3216 01 2724 81 1708 25 1762 48 617 436 1650 79 我的问题是如何引用第一行的第一个字段并在同一计算中引用第二行的第一个字段 为了完
  • 从unix中的内部列中删除csv文件中的新行字符

    输入数据示例 cat test csv 234 aa bb cc 30 dd 22 cc ff dd 40 gg pxy aa cc 40 dd 所需输出 cat test new csv 234 aa bb cc 30 dd 22 cc
  • awk 有条件地组合多行

    我想将多行不同长度的值合并到一行 如果它们与 ID 匹配 输入示例是 ID Value a 1 49 a 2 75 b 1 120 b 2 150 b 3 211 c 1 289 d 1 301 d 2 322 所需的输出示例是 ID Va
  • 将 CSV 文件拆分为较小的文件但保留标题?

    我有一个巨大的 CSV 文件 有 100 万行 我想知道是否有一种方法可以将此文件拆分为较小的文件 但保留所有文件的第一行 CSV 标题 它似乎split速度非常快 但也非常有限 您不能向文件名添加后缀 例如 csv split l1100
  • awk 计数频率

    嘿 我想统计 awk 中某一列的数据量 一个示例数据集是 2 5 8 1 3 7 8 5 9我想计算第二列中 5 的出现频率 这就是我尝试过的方法 但没有成功 total 0 for i 1 i lt NF i if i 2 if i 5
  • 使用 grep 仅打印上下文

    Using grep http www computerhope com unix ugrep htm 您可以打印与您的搜索查询匹配的行 添加一个 C选项将打印两行周围的上下文 如下所示 gt grep C 2 lorem some con
  • 使用awk对字段进行排序和排列

    我现在正在尝试学习 awk 我想做一项特定的任务 我的问题与之前发布的问题范围相似 使用 awk 将列转置为行 https stackoverflow com questions 13634816 using awk to transpos
  • Bash 脚本问题

    我可以很好地运行这个命令 并得到我想要的输出 ifconfig eth0 grep HWaddr awk print 5 但是 当我将命令设置为变量并打印该变量时 出现错误 CASS INTERNAL ifconfig eth0 grep
  • 如何在 awk 或 sed 中编写查找所有函数(使用正则表达式)

    我有运行 python 的 bash 函数 它从标准输入返回所有找到的正则表达式 function find all python c import re import sys print n join re findall 1 sys s
  • 按行号和列号对文件进行子集化

    我们想要按行和列对文本文件进行子集化 其中行数和列数是从文件中读取的 不包括标题 第 1 行 和行名称 第 1 列 输入文件 txt制表符分隔的文本文件 header 62 9 3 54 6 1 25 1 2 3 4 5 6 96 1 1
  • 文本处理问题:删除其中一列不包含特定值的行

    我有一个制表符分隔的文件 如下所示 input sequence match sequence score receptor group epitope antigen organism ASRPPGGVNEQF ASRPPGGVNEQF
  • 仅当重复行与模式匹配时才删除它们

    这个问题 https stackoverflow com questions 1444406 how can i delete duplicate lines in a file in unix有一个很好的答案说你可以使用awk seen
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • git 别名中的 AWK 语句

    我正在尝试创建一个 git 别名来以特定格式打印日志中的所有拉取请求 但是 我在使用 AWK 删除双空格时遇到问题 这是使用以下命令的 git log 的输出 git log merges grep pull request pretty
  • awk/Unix 分组依据

    有这个文本文件 name age joe 42 jim 20 bob 15 mike 24 mike 15 mike 54 bob 21 试图得到这个 计数 joe 1 jim 1 bob 2 mike 3 Thanks awk F NR
  • 协助 awk/bash 捕获内存差异

    我正在尝试从以下文件中提取以下输出 xr lab show clock Thu Sep 19 14 38 02 812 WIB 14 38 02 893 WIB Thu Sep 19 2019 xr lab xr lab xr lab sh

随机推荐