AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题

问题[awk](coding)

Martin Hope
dasunsrule32
Asked: 2025-02-26 03:24:17 +0800 CST

使用 awk 获取 PCI 地址

  • 8

我正在编写一行代码来从 Incus 获取 GPU 的 PCI 地址。以下是该命令第一部分的输出:

incus info --resources | grep -E 'GPU:|GPUs:' -A 20
GPUs:
  Card 0:
    NUMA node: 0
    Vendor: ASPEED Technology, Inc. (1a03)
    Product: ASPEED Graphics Family (2000)
    PCI address: 0000:22:00.0
    Driver: ast (6.12.9-production+truenas)
    DRM:
      ID: 0
      Card: card0 (226:0)
      Control: controlD64 (226:0)
  Card 1:
    NUMA node: 0
    Vendor: NVIDIA Corporation (10de)
    Product: GP102 [GeForce GTX 1080 Ti] (1b06)
    PCI address: 0000:2b:00.0
    Driver: nvidia (550.142)
    DRM:
      ID: 1
      Card: card1 (226:1)
      Render: renderD128 (226:128)
    NVIDIA information:
      Architecture: 6.1
      Brand: GeForce
      Model: NVIDIA GeForce GTX 1080 Ti
      CUDA Version: 12.4
      NVRM Version: 550.142
      UUID: GPU-9d45b825-9a28-afab-1189-e071779f7469

我使用grep将其限制为'amd|intel|nvidia',awk打印PCI Address:,然后sed删除空格。我一直得到一个尾随的哈希(#)字符,它实际上是从 生成的printf。printf会自动为我删除所有额外的字符newlines。但是,我还没有找到一种方法来消除哈希字符。我在这里遗漏了什么?如果有更好的方法,我也会接受。谢谢!

incus info --resources | grep -E 'GPU:|GPUs:' -A 20 | grep -Ei 'amd|intel|nvidia' -A 20 | awk -F "PCI address:" '{printf $2}' | sed 's/ //'
0000:2b:00.0#

编辑:简而言之,为了增加一些清晰度,我只需要从、或PCI Address:之一中获取并输出 PCI 地址:仅。amdintelnvidia

awk
  • 5 个回答
  • 79 Views
Martin Hope
Tedee12345
Asked: 2025-02-18 23:57:57 +0800 CST

AWK 将值从 $1 复制到下面一行

  • 9

输入文件。

44

55



14
15

16

我想要获取一个输出文件。

44
44
55
55
55
55
14
15
15
16
16 

我试过。

awk '{print $NF-1}' plik 
43
-1
54
-1
-1
-1
13
14
-1
15
awk
  • 2 个回答
  • 54 Views
Martin Hope
Tedee12345
Asked: 2025-02-14 20:21:39 +0800 CST

AWK 根据第 $1 列的最后一个重复项,在第 $4 列中打印第 $3 列的值

  • 6

我有一个输入文件。

30.01.2025                  47288.39        47288.39 
30.01.2025                  -1.00           47287.39 
31.01.2025                  50.00           47337.39 
31.01.2025                  -1600.00        45737.39 
31.01.2025                  1880.00         47617.39 
31.01.2025                  18.21           47635.60 
31.01.2025                  -3.46           47632.14 
03.02.2025                  -51.00          47581.14 
03.02.2025                  -10.00          47571.14 
04.02.2025                  -1600.00        45971.14 
04.02.2025                  1609.00         47580.14 
05.02.2025                  -800.00         46780.14 
05.02.2025                  -320.00         46460.14 
05.02.2025                  51.00           46511.14 
05.02.2025                  800.00          47311.14 
05.02.2025                  11.00           47322.14 

在此处输入图片描述

我想要获取一个输出文件。

30.01.2025     47288.39      47288.39 
30.01.2025     -1.00         47287.39      47287.39
31.01.2025     50.00         47337.39 
31.01.2025     -1600.00      45737.39 
31.01.2025     1880.00       47617.39 
31.01.2025     18.21         47635.60 
31.01.2025     -3.46         47632.14      47632.14
03.02.2025     -51.00        47581.14 
03.02.2025     -10.00        47571.14      47571.14 
04.02.2025     -1600.00      45971.14 
04.02.2025     1609.00       47580.14      47580.14
05.02.2025     -800.00       46780.14 
05.02.2025     -320.00       46460.14 
05.02.2025     51.00         46511.14 
05.02.2025     800.00        47311.14 
05.02.2025     11.00         47322.14      47322.14

我试过。

awk '{if(!seen[$1]++){print $0}}' File_1
awk
  • 3 个回答
  • 63 Views
Martin Hope
Renaud Pacalet
Asked: 2025-02-10 20:37:57 +0800 CST

如何检查变量是否存在,如果不存在则为其分配默认值?

  • 7

使用 GNU awk5.3.1,如果命令行中没有为变量指定默认值,我想为它分配一个默认值。该值可以是任何值,包括 0。我以为我可以使用,SYMTAB但由于SYMTAB在解析期间和执行之前构建,它不起作用:

$ awk -v v=1 'BEGIN { if(!("v" in SYMTAB)) v = 42; print "v = " v }' /dev/null
v = 1
$ awk 'BEGIN { if(!("v" in SYMTAB)) v = 42; print "v = " v }' /dev/null
v = 

还有其他方法吗?

awk
  • 2 个回答
  • 34 Views
Martin Hope
Rasec Malkic
Asked: 2025-02-10 13:25:30 +0800 CST

提取字符串后的行并在单行中打印多个值

  • 6

我有几个文件格式如下

some text
some text
This section is for WXYZ
some text
some text
some text
some text
some text
some text (ABC) some text (CDF)
901 98
some text FFG
some text (FFG)
1 99
some text
some text

我正在尝试打印每个文件

  1. 文件名
  2. 同一行中“This section is for”后面的字符串
  3. 包含以下字符串的行(ABC)
  4. 包含以下字符串的行(FFG)

这是我当前的脚本(基于此线程中的答案)

awk '/This section is for/{sub(/This section is for /,""); print FILENAME "|" $0}
     a{print;a=0} /\(ABC\)/{a=1}
     b{print;b=0} /\(FFG\)/{b=1}
' "testfile.txt"

我得到了这个输出

testfile.txt|WXYZ
901 98
1 99

我希望每个文件的输出都是一行,像这样

testfile.txt|WXYZ|901 98|1 99

如何修改脚本以实现我的目标?谢谢

awk
  • 3 个回答
  • 41 Views
Martin Hope
Roger Costello
Asked: 2024-12-29 22:14:15 +0800 CST

如何向 AWK 程序输入一系列字段名称并让 AWK 程序检查文件中是否存在该字段名称?

  • 6

field-names.txt 包含字段名称列表:

AB_CODE
ACFT_CODE
AC_TYPE
ADD_INFO
AKA
ALT
ALT1_DESC
ALT2_DESC
ALT3_DESC

对于每个字段名称,我想打印第一行包含此字段名称的文件(以空格分隔的字段列表)。以下是我尝试的:

在bash命令行我输入了以下内容:

cat field-names.txt | awk 'BEGIN { getline fieldname; print fieldname }
        
NR == 1 && $0 ~ /fieldname/ { print FILENAME }' **/*.TXT

这会产生错误的结果。正确的做法是什么?

awk
  • 4 个回答
  • 76 Views
Martin Hope
aenagy
Asked: 2024-12-23 03:45:49 +0800 CST

awk gsub 不会替换字段中的所有句点实例

  • 6

我正在尝试解析一些输出,以便最终可以用来declare创建多个环境变量。我遇到的问题是,awk我的语句没有替换第一个字段 ( $1) 中的所有句点。

输入来自:

etherNIC=$(nmcli --get-values NAME connection show)
nmcli connection show $etherNIC | grep -i  "ipv4.gateway\|ipv4.route" > ./ipv4settings.txt

...看起来像这样:

cat ./ipv4settings.txt
ipv4.gateway:                           192.168.2.1
ipv4.routes:                            --
ipv4.route-metric:                      -1
ipv4.route-table:                       0 (unspec)

这是输出awk:

cat ./ipv4settings.txt | awk '{ split($0, array, ":") ; gsub( "\\.", "_", $1 ) ;  gsub( ":" , "=" , $1 ) ; print $1$2 }'
ipv4_gateway=192.168.2.1
ipv4_routes=--
ipv4_route-metric=-1
ipv4_route-table=0

问题是gsub( "\\.", "_", $1 )不能替换.中的所有出现$1。我想要的输出是:

ipv4_gateway=192.168.2.1
ipv4_routes=--
ipv4_route_metric=-1
ipv4_route_table=0

在这种情况下,第二个.已被正确替换为_。

awk --version
GNU Awk 5.1.0, API: 3.0 (GNU MPFR 4.1.0-p9, GNU MP 6.2.0)
Copyright (C) 1989, 1991-2020 Free Software Foundation.
<snip>

编辑#1

我刚刚意识到的正确输出ipv4.route-table应该0 (unspec)不是0。

awk
  • 2 个回答
  • 66 Views
Martin Hope
pablo
Asked: 2024-12-17 00:23:42 +0800 CST

根据两列值打印行

  • 3

我有一个像这样的两列文件(第二列已排序):

m       8569
=       8569
u       8569
j       8569
=       8570
m       8570
j       8570
c       8570
j       8571
j       8572
j       8573
n       8573
=       8573
m       8573
c       8573
u       8574
u       8574

我需要打印 col1 中的值为 "u" 的行,但仅当此值与 col2 中的所有相同值相关联时。我应该得到:

u       8574
u       8574

例如,这在这里不起作用,因为“u”值与“8569”值相关联,但还有“m”,“=”和“j”值:

m       8569
=       8569
u       8569
j       8569

我也尝试处理这个问题(awk group by 并打印是否符合条件)但我无法获得仅匹配字符“u”的行。

最好的

awk
  • 3 个回答
  • 51 Views
Martin Hope
Potatoswatter
Asked: 2024-12-08 03:40:26 +0800 CST

getline 前进到下一个文件而不是返回 EOF

  • 3

getline指定读取“来自当前输入文件”并在文件末尾返回 0。gawk和POSIX文档都使用这种措辞。这是有道理的:数据可能出于某种原因在文件之间分配。如果可以区分文件,语言会更具表现力。结构足够合理的信息通常不会跨越文件边界。getlinegetline

但是 GNU 和 macOS/BSD 实现都隐藏了 EOF 并立即打开下一个文件。这样做会更新FILENAME,而这不在 GNU 或 POSIX 文档中指定受影响的变量列表中。

我看到的唯一解决方法是确保每个文件都以一个一次性的行开头,并检测何时FNR重置为 1。真恶心。

这两种实现都存在此错误,这真是一个奇怪的巧合。查看源代码,这两种行为都不是疏忽。两者都采取了特定的步骤来推进文件,而不是getline从命名的 I/O 句柄进行代码分支。冗长的 GNU 文档与此行为相矛盾,这尤其奇怪。

我是不是漏掉了什么?我是不是偶然发现了一个不常见的案例,或者这是 Awk 传说中已知的?

awk
  • 1 个回答
  • 61 Views
Martin Hope
Gert Gottschalk
Asked: 2024-12-06 03:49:36 +0800 CST

使用 awk 打印模式之间的行

  • 8

回到这个讨论: 打印两个模式之间的所有行,排他,仅第一个实例(在 sed、AWK 或 Perl 中)

一旦结束模式是起始模式的子字符串,所提出的解决方案就会失败。

示例输入:

aaa
PATTERNSTART
bbb
ccc
ddd
PATT
eee

产生输出故障:

awk '/PATT/{exit} f; /PATTERNSTART/{f=1}' dat

返回结果为空,与预期不符

bbb
ccc
ddd

特殊情况:

  • 如果未找到起始模式,则不执行任何操作
  • 如果没有遇到结束模式,则从起始模式打印到文件末尾
  • 仅考虑第一次出现的开始/结束模式对

不确定我是否找到了所有极端情况。上述情况以外的极端情况可能会得到规范处理。谢谢。

awk
  • 3 个回答
  • 72 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve