AWK输出到分隔字符串

AWK输出到分隔字符串,awk,gawk,Awk,Gawk,以下 awk/\-0.81/{print$0}'fullYearData.txt 已成功找到的实例 -0.81 在一长串行中,如下所示: 2017-01-10 16:58 0.90 feet Low Tide 2017-01-10 22:54 2.10 feet High Tide 2017-01-11 07:19 -0.81 feet Low Tide 2017-01-11 14:15 1.06 feet High Tide 2017-01-11 17:48 0.89

以下

awk/\-0.81/{print$0}'fullYearData.txt

已成功找到的实例

-0.81

在一长串行中,如下所示:

2017-01-10 16:58   0.90 feet  Low Tide
2017-01-10 22:54   2.10 feet  High Tide
2017-01-11 07:19  -0.81 feet  Low Tide
2017-01-11 14:15   1.06 feet  High Tide
2017-01-11 17:48   0.89 feet  Low Tide
2017-01-11 23:42   2.13 feet  High Tide
2017-01-12 08:03  -0.81 feet  Low Tide
2017-01-12 14:51   1.06 feet  High Tide
2017-01-11 07:19  -0.81 feet  Low Tide, 2017-01-12 08:03  -0.81 feet  Low Tide
输出:

2017-01-11 07:19  -0.81 feet  Low Tide
2017-01-12 08:03  -0.81 feet  Low Tide
如何在一行中输出结果(本例中为两行),如下所示:

2017-01-10 16:58   0.90 feet  Low Tide
2017-01-10 22:54   2.10 feet  High Tide
2017-01-11 07:19  -0.81 feet  Low Tide
2017-01-11 14:15   1.06 feet  High Tide
2017-01-11 17:48   0.89 feet  Low Tide
2017-01-11 23:42   2.13 feet  High Tide
2017-01-12 08:03  -0.81 feet  Low Tide
2017-01-12 14:51   1.06 feet  High Tide
2017-01-11 07:19  -0.81 feet  Low Tide, 2017-01-12 08:03  -0.81 feet  Low Tide
甚至更短:

awk '/-0.81/{a=!a ? $0 : a", "$0} END{print a}' fullYearData.txt
将匹配行追加到变量(
a
)并在
末尾
打印变量
a
。最初
a
将为零,而
if else
检查用于确定何时需要添加
(即不是第一次,而是为后续模式匹配行添加

另一个awk解决方案

awk 'BEGIN{old_ORS=ORS;ORS=", "}/-0.81/{print}END{ORS=old_ORS;print}' fullYearData.txt

缓冲输出到
b
并在
结束时打印:

$ awk '/-0.81/{b=b (b==""?"":", ") $0}END{print b}' file
2017-01-11 07:19  -0.81 feet  Low Tide, 2017-01-12 08:03  -0.81 feet  Low Tide

另一个选项是引入字段分隔符变量
f
,该变量在第一次匹配后设置

awk '/-0.81/{s=s f $0; f=", "} END{print s}' fullYearData.txt

最初,两个变量
s
f
都将包含空字符串(“”)。

只需打印不带CR/LF的筛选行(第一次出现后,最困难的部分是“,”)


printf
中的
\n
不必要地将
awk
绑定到特定的实现,因为不同的发行版处理转义序列的方式不同。
print a
在这里就足够了,可以成为更一般的解决方案。您不必在模式中转义
-
,因为它没有特殊的平均值除在
[a-c]