gpt4 book ai didi

linux - 关于使用 ORS、NR、FS、RS 的 awk 命令的说明

转载 作者:可可西里 更新时间:2023-11-01 11:48:07 26 4
gpt4 key购买 nike

我有一个示例数据集:

1
2
3
4
5
6

它被以下 awk 命令成功解析为所需的输出

awk 'ORS=NR%3?FS:RS'

1 2 3
4 5 6

能否请您解释一下此命令的作用?我无法将各个部分放在一起。

据我了解:

  • ORS = 输出记录分隔符 - 这是我们希望 RS 用于最终输出的内容,即一行 3 列

  • NR%3 = 我们想将数据分组为 3 个元素的行

  • ?FS:RS - 不确定这如何适合命令。

谢谢。

最佳答案

% 是模运算符(参见 https://en.wikipedia.org/wiki/Modulo_operation ),NR%3?FS:RS 是三元表达式(参见 https://en.wikipedia.org/wiki/%3F: )。这些都是许多编程语言中的常见结构,它们不是 awk 特有的。有关 ORS、NR、FS 和 RS 的含义,请参阅 awk 手册页。

运行此命令以查看您正在执行的命令前后代码中变量的值:

$ cat tst.awk
BEGIN {
printf "%s=\"%s\"\n", "RS", RS
printf "%s=\"%s\"\n", "FS", FS
}
{
printf "---\n"

printf "%s=\"%s\"\n", "$0", $0
printf "%s=\"%s\"\n", "NR", NR
printf "%s=\"%s\"\n", "NR%3", NR%3

printf "before) %s=\"%s\"\n", "ORS", ORS

ORS = (NR%3 ? FS : RS)

printf "after) %s=\"%s\"\n", "ORS", ORS
}

.

$ awk -f tst.awk file
RS="
"
FS=" "
---
$0="1"
NR="1"
NR%3="1"
before) ORS="
"
after) ORS=" "
---
$0="2"
NR="2"
NR%3="2"
before) ORS=" "
after) ORS=" "
---
$0="3"
NR="3"
NR%3="0"
before) ORS=" "
after) ORS="
"
---
$0="4"
NR="4"
NR%3="1"
before) ORS="
"
after) ORS=" "
---
$0="5"
NR="5"
NR%3="2"
before) ORS=" "
after) ORS=" "
---
$0="6"
NR="6"
NR%3="0"
before) ORS=" "
after) ORS="
"

请注意输出记录分隔符 (ORS) 的输入行号 (NR) 变为换行符(如 RS)与空白字符(如 FS)。

编写相同代码的更详细的方法是:

$ cat tst.awk
{
if (NR%3 == 0) {
ORS = "\n"
}
else {
ORS = " "
}

print
}

$ awk -f tst.awk file
1 2 3
4 5 6

仅供引用,在您的问题中尝试编写简洁、惯用代码的正确(更健壮和更清晰)的方法是:

awk '{ORS=(NR%3?FS:RS)}1'

在某些情况下,某些 awk 需要三元组周围的括号,并且始终提高可读性,因此请始终使用它们。原始代码依赖于分配给 ORS 的结果产生一个非空/非零值,以便它成为一个真实的条件,因此调用打印当前记录的 awks 默认操作。仅在需要时才在该上下文中使用操作的结果,否则有一天当您的数据不完全符合您的预期时它会咬你。我没有将赋值留在条件 block 中,而是将其移至操作 block 中,然后添加了一个常量 true 条件,1 以确保打印每条记录,无论赋值结果如何。

关于linux - 关于使用 ORS、NR、FS、RS 的 awk 命令的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55997954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com