複数行のテキストをカンマ区切り文字を使用して 1 行に解析します。

複数行のテキストをカンマ区切り文字を使用して 1 行に解析します。

speedtest-cliツールを使用して帯域幅を追跡したいと思います。 1時間ごとに次のテキストファイルを作成できます。

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行のテキストを解析して特定のデータを抽出し、コンマ区切り文字を使用して出力を1行にリダイレクトして既存のファイルに追加するにはどうすればよいですか?つまり:

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を使用して、各行の2番目から最後のレコードを印刷します。これはわずかに脆弱ですが、入力サンプルに適しています。また、行全体を処理する awk 機能を活用するため、$01 行にレコードが 1 つしかない場合は、行全体を印刷します。これはNR==1 ?"":", "、最初の行を除くすべての行に区切り文字を印刷する三項演算子です。これは改行文字を印刷しないため、echo改行文字を取得するためにanで終わります。

2番目の解決策は、各行(または1つのフィールドのみを持つ行全体)の2番目のレコードを再印刷しますが、END句を使用して最後の改行を印刷し、レコード区切り文字を使用してコンマを挿入します。これは望ましくない末尾の改行を引き起こします。これは最終的でクリーンなソリューションにインスピレーションを与えました。

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

ここでは、末尾に改行文字を追加するのではなく、4行を読み取るときに出力レコード区切り文字を変更します。

おすすめ記事