将多行文本解析为具有逗号分隔符的单行

将多行文本解析为具有逗号分隔符的单行

我想使用 speedtest-cli 工具跟踪我的带宽。每小时我都可以创建一个文本文件,如下所示:

2020-10-30-09:21:28
Hosted by ISP (City, ST) [141.56 km]: 3.549 ms
Download: 892.81 Mbit/s
Upload: 940.12 Mbit/s

我的目标是创建某种类型的表来存储这些信息以满足历史和图形需求。我认为 CSV 文件可能很适合这个。如何解析这 4 行文本以提取特定数据并将输出重定向到带有逗号分隔符的单行,并附加到现有文件? IE:

Date, Response Time, Download (Mbit/s), Upload (Mbit/s)
2020-10-30-09:21:28, 3.549, 892.81, 940.12

答案1

逗号后面有空格有点不典型,但你可以简单地这样做:

{ awk '{printf "%s%s", NR==1 ? "": ", ", $(NF-1)}' input; echo; } >> output

或者,如果您可以接受尾随逗号:

awk '{print $(NF-1)} END{printf"\n"}' ORS=', ' input >> output

第一个解决方案使用 printf 打印每行的倒数第二条记录。这有点脆弱,但适用于您的输入样本。它还利用了 awk 的一个特性,即视为$0整行,因此如果一行中只有一条记录,它会打印整行。这NR==1 ?"":", "只是一个三元运算符,它在除第一行之外的所有行上打印分隔符。由于这永远不会打印换行符,因此我们以 an 结尾echo以获得换行符。

第二种解决方案再次打印每行的倒数第二条记录(或者一行的整行只有一个字段),但使用 END 子句打印最后的换行符并使用记录分隔符插入逗号。这会导致不需要的尾随换行符。这激发了最终的、更清洁的解决方案:

awk 'NR==4{ORS="\n"}{print $(NF-1)}' ORS=', ' input

在这里,我们在读取第 4 行时更改输出记录分隔符,而不是在末尾添加换行符。

答案2

pcregrep使用正则表达式可以方便地从多行输入中提取和报告数据。

这里:

<input.txt pcregrep --om-separator=', ' -o1 -o2 -o3 -o4 -M \
  '^(.*)\n.*?(\S+) ms\n.*?(\S+) Mbit/s\n.*? (\S+) Mbit/s$'

perl或者与(the pin )相同pcregrep

perl -l -0777 -ne 'print join ", ", $1, $2, $3, $4 if 
  m{^(.*)\n.*?(\S+) ms\n.*?(\S+) Mbit/s\n.*? (\S+) Mbit/s$}'

相关内容