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
最初,变量 s
和 f
都将包含空字符串 ("")。
简单地打印没有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
以下
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
最初,变量 s
和 f
都将包含空字符串 ("")。
简单地打印没有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