AWK输出到分隔的字符串

时间:2017-04-28 03:21:04

标签: 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 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

5 个答案:

答案 0 :(得分:3)

另一种选择是引入在第一次匹配后设置的字段分隔符变量f

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

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

答案 1 :(得分:2)

$ awk '/-0.81/{if(!a)a=$0; else a=a", "$0} 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 ? $0 : a", "$0} END{print a}' fullYearData.txt

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

答案 2 :(得分:1)

另一个awk解决方案

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

答案 3 :(得分:1)

缓冲输出到Q并打印在b

END

答案 4 :(得分:1)

只需打印没有CR / LF的过滤器线(首次出现后为“,”,这是最困难的部分)

awk '/-0.81/{printf( "%s%s", ! a++ ? "" : ", ", $0)}' YourFile

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