输入文件。
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
输入文件。
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
我有一个输入文件。
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
使用 GNU awk
5.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 =
还有其他方法吗?
我有几个文件格式如下
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
我正在尝试打印每个文件
(ABC)
(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
如何修改脚本以实现我的目标?谢谢
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
这会产生错误的结果。正确的做法是什么?
我正在尝试解析一些输出,以便最终可以用来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
。
我有一个像这样的两列文件(第二列已排序):
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”的行。
最好的
getline
指定读取“来自当前输入文件”并在文件末尾返回 0。gawk和POSIX文档都使用这种措辞。这是有道理的:数据可能出于某种原因在文件之间分配。如果可以区分文件,语言会更具表现力。结构足够合理的信息通常不会跨越文件边界。getline
getline
但是 GNU 和 macOS/BSD 实现都隐藏了 EOF 并立即打开下一个文件。这样做会更新FILENAME
,而这不在 GNU 或 POSIX 文档中指定受影响的变量列表中。
我看到的唯一解决方法是确保每个文件都以一个一次性的行开头,并检测何时FNR
重置为 1。真恶心。
这两种实现都存在此错误,这真是一个奇怪的巧合。查看源代码,这两种行为都不是疏忽。两者都采取了特定的步骤来推进文件,而不是getline
从命名的 I/O 句柄进行代码分支。冗长的 GNU 文档与此行为相矛盾,这尤其奇怪。
我是不是漏掉了什么?我是不是偶然发现了一个不常见的案例,或者这是 Awk 传说中已知的?
回到这个讨论: 打印两个模式之间的所有行,排他,仅第一个实例(在 sed、AWK 或 Perl 中)
一旦结束模式是起始模式的子字符串,所提出的解决方案就会失败。
示例输入:
aaa
PATTERNSTART
bbb
ccc
ddd
PATT
eee
产生输出故障:
awk '/PATT/{exit} f; /PATTERNSTART/{f=1}' dat
返回结果为空,与预期不符
bbb
ccc
ddd
特殊情况:
不确定我是否找到了所有极端情况。上述情况以外的极端情况可能会得到规范处理。谢谢。
在 AWK 中,为了对数组进行排序,我可以定义自己的排序函数,既可以在 for 循环中控制数组的遍历,也可以调用asort
或asorti
。比较函数的签名最多接受 6 个参数,但最后两个参数是可选的:
function cmp_field(i1, v1, i2, v2, l, r) { whatever; }
l
和的用途是什么r
?据我所知,它们只是占位符,AWK 根本不使用或检查它们,而是为了我自己方便,以便我可以在它们内部存储值,作为某种便利辅助变量。例如分配l
和从和r
计算出的临时值。但是,为什么我需要它们或它们的用途是什么,如果我可以像这样声明自己的变量:v1
v2
function cmp_field(i1, v1, i2, v2) {
l = computation(v1);
r = computation(v2);
whatever;
}
l
除了第二个例子中的全局变量之外,还有其他区别吗r
?或者除此之外还有其他原因吗?