コピペしたら残念な位置に改行が入ってしまったテーブルをawkで整形する

2021/10/13

awk

t f B! P L

コピペしたら残念な位置に改行が入ってしまったテーブルをawkで整形する

問題

こういうデータをコピペしたら

0001	AAA	12:00	13:00	success
0002	BBB	13:00	14:00	success
0003	CCC	14:00	15:00	failed
0004	DDD	15:00	16:00	failed

こんなふうになってしまったことありませんか。

0001	AAA	12:00
13:00	success
0002	BBB	13:00
14:00	success
0003	CCC	14:00
15:00	failed
0004	DDD	15:00
16:00	failed

内容は適当です。
HTMLのTable部分をコピペしたときによく起こります。
具体的には、時刻の部分が改行されて1つのtdタグに収まっているとき。

エクセルやGoogleスプレッドシートは賢いので、列間に適切なセパレータが入っていれば自動で別の列に分割してくれますが、
上記のように変な位置に改行が入っていると別の行になってしまう。

解決策

pbpaste | awk 'NF==3 {ORS="\t"; print} NF!=3 {ORS="\n"; print}' | pbcopy

pbpasteでクリップボードの内容をstdoutに貼り付け、awkで処理、pbcopyでstdoutをクリップボードにコピーしてます。

Ubuntu系だとxselというパッケージを入れて、bashに下記のaliasを書くとpbcopy/pbpasteが使えて便利です。

alias pbcopy='xsel --clipboard --input'
alias pbpaste='xsel --clipboard --output'

解説

awkには組み込み変数がいくつかあります。よく使うのは以下。

  • NR: 処理中のレコードの番号(行番号)
  • NF: 処置中の行のフィールド数(カラム数)
  • ORS: 出力時のレコードのセパレータ
  • OFS: 出力時のフィールドのセパレータ

これらは処理中に上書きできるので、今回は行によってORSを書き換えることで不適切な位置にある改行を実質的に削除しています。

例では、NFが3列のときに、レコードセパレータとしてタブを使用すれば不適切な改行を消せますね。
また、奇数行目のORSをタブにしたいので、NRを2で割った余りを使っても良いですね(NRはone-based)。

ズレると言っても規則的にズレてるので、↑のような条件はほとんどのケースで利用できると思います。
文字列の内容を判定してORSをいじる必要はないです。awkなので正規表現で文字列の内容を見ることも得意だろうけども。

コピペしている以上、コピペできる程度のデータ量ということになるので、awkでさっと処理するのが便利です。

ラベル

QooQ