AWK 输出到分隔字符串

AWK output to a delimited string

以下

awk/\-0.81/ { print [=13=] }' 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

如何在一行中输出结果(本例中为 2 行),如下所示:

2017-01-11 07:19  -0.81 feet  Low Tide, 2017-01-12 08:03  -0.81 feet  Low Tide
$ awk '/-0.81/{if(!a)a=[=10=]; else a=a", "[=10=]} END{print a}' fullYearData.txt
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 ? [=11=] : a", "[=11=]} END{print a}' fullYearData.txt

将匹配行附加到变量 (a) 并在 END 处打印变量 a。最初 a 将为零并且 if-else 检查用于决定何时需要添加 , (即不是第一次,但为后续模式添加 ,匹配的行。

另一个awk解决方案

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

缓冲输出到b并打印在END:

$ awk '/-0.81/{b=b (b==""?"":", ") [=10=]}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 [=10=]; f=", "} END{print s}' fullYearData.txt

最初,变量 sf 都将包含空字符串 ("")。

简单地打印没有CR/LF的过滤行(第一次出现后有一个“,”,这里是最困难的部分)

awk '/-0.81/{printf( "%s%s", ! a++ ? "" : ", ", [=10=])}' YourFile

# with final new line if needed
awk '/-0.81/{printf( "%s%s", ! a++ ? "" : ", ", [=10=])}END{print}' YourFile