bash:stdoutを複数コマンドへpipe

以前 (command1; command 2) < file で同じ入力を同時に複数コマンドに食わせることができると書きました。

Mac OS XとLinuxで動作が違うとかpipe渡しの場合に使えない

headとtailを1 passで表示:bash編

久々に使ってみたら制限が多すぎてあまり使う場面が無さそうなことが分かってきました。例えば以下が動きません。

$ (head -1;tail -1) < <(yes|head -11|cat -n)
     1  y

替わりに見つけたのが tee です。

$ yes|head -11|cat -n |
 tee >(tail -1) >(head -1) >/dev/null
     1  y
    11  y

よくよく注意してmanual見てみたら引数に複数ファイル指定できるんですね!目から鱗でした。

Redirect output to multiple files or processes

GNU Coreutils: tee invocation

ただし落とし穴として出力の順番が保証されないという件がありそうです。tee を複数回起動すればいいのかな?

sed external command substitution

GNU sed has ‘/e’ flag for ‘s///’ substitution command.

This command allows one to pipe input from a shell command into pattern space.

sed, a stream editor

I used this feature for the first time and I learned that this doesn’t work clean if content has special characters. e.g.) ‘”’, “’”, . I had a hard time escaping double quote and single quote.

Here’s the file I wanted to process.

$ cat plain_json_mix.txt
1st line is just a text , non-JSON
{ "str1": "First string without single quote","obj0":{"str2":"This is nested JSON and has single quote ' here"},"numarr0":[0,1,2]}
3rd line is just text again ":double quote, ':single quote
{ "4th line" :  "Final line is JSON" }

So, 2nd line and 4th line is JSON so I want to feed only these 2 lines to ‘jq’.

Below is the very kludgy work-around. And this doesn’t even work if JSON contains ‘>’: “greater than” character.

$ sed '/^{/s|"|\\\\x22|g;/^{/s|'\''|\\\\x27|g;s|^{.*|/bin/echo -e &\|jq .|e' plain_json_mix.txt
1st line is just a text , non-JSON
{
  "str1": "First string without single quote",
  "obj0": {
    "str2": "This is nested JSON and has single quote ' here"
  },
  "numarr0": [
    0,
    1,
    2
  ]
}
3rd line is just text again ":double quote, ':single quote
{
  "4th line": "Final line is JSON"
}

Apache Impala対Oracle

どちらも大量データ大量同時使用ユーザーで使われるDBですね。アドホックSQLでもBIツールSQLでもML系SQLでも何でもいいですがユーザー毎、セッション毎に使用可能リソース量を制限する機能があります。

Impala にはAdmission Controlという機能がありますがこの機能を説明したオライリーイベントのセッションのPowerpoint(*.pdf)資料が公開されてるのをたった今見つけました。

Apache Impala has offered fast SQL analytics over big data

When SQL users run wild: Resource management features and techniques to tame Apache Impala: Big data conference & machine learning training | Strata Data

Oracleデータベースの Resource Manager と Statement Queuing に相当する機能だと思います。

Parallel Statement Queuing with Oracle Database Resource Manager

VLDB and Partitioning Guide