awk&x27;s记录范围:是否忽略行的最后一个字段?

awk&x27;s记录范围:是否忽略行的最后一个字段?,awk,Awk,如果我有以下文件: 0 on 0 off 0 0 ... 命令: awk '$1 == "on", $1 == "off"' < file 返回的值与预期值相同: on ; 0 off ; 这里发生了什么?似乎awk不喜欢我的字段是一行的最后一行。 我尝试将$1更改为$0,并将$0==“on”更改为$0==“on”,但没有成功 有没有办法处理awk的记录范围,即记录的最后一个字段 参考:您可以尝试下面的awk命令 $ awk '$1 == "on", $1 == "off"' fil

如果我有以下文件:

0
on
0
off
0
0
...
命令:

awk '$1 == "on", $1 == "off"' < file
返回的值与预期值相同:

on ;
0
off ;
这里发生了什么?似乎awk不喜欢我的字段是一行的最后一行。 我尝试将
$1
更改为
$0
,并将
$0==“on”
更改为
$0==“on”
,但没有成功

有没有办法处理awk的记录范围,即记录的最后一个字段


参考:

您可以尝试下面的awk命令

$ awk '$1 == "on", $1 == "off"' file
on
0
off

awk -v RS="[\n\r]+" '$1 == "on", $1 == "off"' file
输入文件中可能存在回车符
\r
。因此,将记录分隔符设置为
[\n\r]+
。此正则表达式将指定一个或多个换行符或回车符作为记录分隔符变量的值。

执行此操作时:

awk '...' < file
它将文件名传递给awk以使其打开。通常,这两种方法是等效的。然而,由于行尾的不同,窗口上出现了一个问题

此示例演示了问题:

$ awk '{for(i=1; i<=NF; ++i)print NR, i, "|"$i"|"}'  < file.txt
| 1 |0
| 1 |on
| 1 |0
| 1 |off
| 1 |0
6 1 |0|

如果输入文件中有控制Ms,请在运行命令之前使用dos2unix或类似工具删除它们

此外,使用范围表达式从来没有用过,因为它们会使琐碎的事情稍微简单一些,但任何稍微复杂的事情(例如,不打印开始行和/或结束行)都会导致您编写重复的代码或进行完全的重新编写。只需使用一个标志:

awk '$1 == "on"{f=1} f; $1 == "off"{f=0}' file

哦,很难理解你的例子。@AvinashRaj在阅读了链接的网页后,还不清楚吗?它非常短是的,它正确返回上述预期输出。您试图实现什么目标?@Mary使用
cat-v文件
检查不可打印的字符。还可以尝试在该文件上运行
dos2unix
,然后再次尝试awk。很可能回车符被视为字符串的一部分,类似地,如果我的假设正确,则
awk'$1~“on”、$1~“off”
应该可以工作。您可以使用
sed-ie“s/\r/”文件
如果您没有相同效果的dos2unix。开头有美元符号吗?@TomFenech我想他们遗漏了
,我想这会有帮助
awk-v RS=“[\n\r]+”$1==“开”,“关”文件
@AvinashRaj:你赢了!怎么样?我不明白是的,这确实解决了使用git bash的windows系统上的问题(如果文件被重定向,我将不会得到输出)@玛丽:你不应该使用

$ awk '{for(i=1; i<=NF; ++i)print NR, i, "|"$i"|"}'  < file.txt
| 1 |0
| 1 |on
| 1 |0
| 1 |off
| 1 |0
6 1 |0|
$ awk '{for(i=1; i<=NF; ++i)print NR, i, "|"$i"|"}' file.txt
1 1 |0|
2 1 |on|
3 1 |0|
4 1 |off|
5 1 |0|
6 1 |0|
$ awk '{for(i=1; i<=NF; ++i)print NR, i, "|"$i"|"}' RS='\r\n' < file.txt
1 1 |0|
2 1 |on|
3 1 |0|
4 1 |off|
5 1 |0|
6 1 |0|
awk '$1 == "on"{f=1} f; $1 == "off"{f=0}' file