Nextflowで「たぬき」を「わたぬき」に変換する

## はじめに

Nextflowでいまいちよくわからないものの一つにチャンネルがあります。
Rubyの場合ですと、複数のファイルに対して操作を行うためには、たとえば

```ruby
Dir["*.txt"].each do |f|
  # 操作
end
```

などと `each` でループを書く必要があります。しかし、Nextflowではこれをよしなにやってくれそうです。しかし、今までのRubyプログラミングの経験からこれがいまいち体感できないので、Nextflowでたぬきをわたぬきに変換してみることにしました。

## はじめに

#### たぬきはかわいい

![c9a57ae7c324d9ab.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/eb85ab9a-b897-cdd6-09be-c0f6f30a0740.gif)

たぬきってかわいいですよね。
でも、わたぬきと、たぬきってよく似ていますよね。（まあ、画像はネコなんですけどね！）

これまで、わたぬきを間違えてたぬきと書いてしまった人もいるのではないでしょうか？

そんなときでも大丈夫。
**「たぬき」**を**「わたぬき」**に置換するスクリプトを書いてみましょう。

#### Nextflowとは

ワークフローっていうやつ。ワークフロー言語を使うと再現性が高まると言われているけど、そんなわけもなくて要するにAWSなどの大量検体を処理するためのクラウド環境や一部の選ばえた人しか使えない高級なHPCとのインターフェイスや、Dockerなどの悲喜こもごもをよきにはからってくれたり、すごい人の書いた高品質なフローが使えたりするのがメリット。

## やっていこ！

なんだか はじめに が2回ぐらいあったような気がするかもしれませんが、それは気のせいです。

まずは「たぬき」を「わたぬき」に置換する部分をつくりましょう。ここでは特に難しいことを考えず、
`sed 's/たぬき/わたぬき/g'` 
とやることにしましょう。

まず最初に変換するファイルを用意します。

```plaintext:tanuki_1.txt
たぬき、たぬき。
```

ターミナルで実行します。

```sh
sed 's/たぬき/わたぬき/g' tanuki_1.txt
```

`わたぬき、わたぬき。` と表示されるはずです。

これをNextflow(dsl 2)で書いてみます。

```groovy:tanuki.nf
nextflow.enable.dsl=2

params.input  = ''
params.outdir = ''

Channel
  .fromPath(params.input)
  .set{ input_ch }

process TANUKI_WATANUKI {
  publishDir params.outdir
  input:
    path x
  output:
    path 'result.txt'
  script:
  """
  sed 's/たぬき/わたぬき/g' $x > result.txt
  """
}

workflow {
  TANUKI_WATANUKI(input_ch)
}
```

個人的にはDSL2 ちょっと冗長だな、と正直思う部分もあるのですがまあ、あんまりNextflowに慣れてないからそう思うのかも知れません。実行します。

```sh
nextflow run tanuki.nf --input tanuki_1.txt --outdir result
```

```sh
cat result/result.txt
```

`わたぬき、わたぬき。` と表示されれば大成功です。

## 複数のファイルを変換する

次に複数のファイルを変換します。ここでは、tanuki_1.txt, tanuki_2.txt, tanuki_3.txt を用意しました。


```plaintext:tanuki_1.txt
たぬき、たぬき。
```

```plaintext:tanuki_2.txt
「こら、たぬき、おまえはたぬき汁ということを知っているかっ。」とどなりました。するとたぬきの子はぼんやりした顔をしてきちんと床へ座ったままどうもわからないというように首をまげて考えていましたが、しばらくたって
「たぬき汁ってぼく知らない。」と云いました。ゴーシュはその顔を見て思わず吹き出そうとしましたが、まだ無理に恐い顔をして、
「では教えてやろう。たぬき汁というのはな。おまえのようなたぬきをな、キャベジや塩とまぜてくたくたと煮ておれさまの食うようにしたものだ。」と云いました。
```

```plaintext:tanuki_3.txt
たぬき たみすけ、1927年〈昭和2年〉4月30日 - とは、日本の実業家、政治家、神職。自由民主党富山県連最高顧問。
```

さらに、パスの書かれたCSVファイルも用意します。1行に1パスとします。（ここは相対パスにしていますが、本当は絶対パスにして、後述のスクリプトで`file`ではなく`path`を使うのが正しいNextflowのやりかたっぽいです。）

```plaintext:input_files.csv
id,path
1,tanuki_1.txt
2,tanuki_2.txt
3,tanuki_3.txt
```

先程のNextflowスクリプトを、書き換えて、ファイルリストを受け取るようにしてみましょう。

```groovy:tanuki.nf
nextflow.enable.dsl=2

params.input  = ''
params.outdir = ''

Channel
  .fromPath(params.input)
  .splitCsv(header:true)                           // 追加
  .map{ row-> tuple(row.id, file(row.path)) }      // 追加 絶対パスにして fileではなくpathの方がいいかも
  .view()                                          // デバッグ用
  .set{ input_ch }

process TANUKI_WATANUKI {
  publishDir "$params.outdir/$id"
  input:
    tuple val(id), path(x)                         // 変更
  output:
    path 'result.txt'
  script:
  """
  sed 's/たぬき/わたぬき/g' $x > result.txt
  """
}

workflow {
  TANUKI_WATANUKI(input_ch)
}

```

実行します。

```
nextflow tanuki.nf --input input_files.csv --outdir result
```

ディレクトリの結果確認

```
tree result
```

```
result
├── 1
│  └── result.txt -> /hoge/work/19/61238811ce3dd78634e5d7bd999ef9/result.txt
├── 2
│  └── result.txt -> /hoge/work/c3/f8cc289c86d4caab5860cdd99dd5f8/result.txt
└── 3
   └── result.txt -> /hoge/work/b5/42e922edde5c9521c2ac61bf22c549/result.txt
```

デフォルトでは、結果はワーキングディレクトリへのエイリアスとして貼り付けられます。

結果確認。

```
bat result/*/*.txt
```

```
───────┬────────────────────────────────────────────────────────────────────────
       │ File: result/1/result.txt
───────┼────────────────────────────────────────────────────────────────────────
   1   │ わたぬき、わたぬき。
───────┴────────────────────────────────────────────────────────────────────────
───────┬────────────────────────────────────────────────────────────────────────
       │ File: result/2/result.txt
───────┼────────────────────────────────────────────────────────────────────────
   1   │ 「こら、わたぬき、おまえはわたぬき汁ということを知っているかっ。」とど
       │ なりました。するとわたぬきの子はぼんやりした顔をしてきちんと床へ座った
       │ ままどうもわからないというように首をまげて考えていましたが、しばらくた
       │ って
   2   │ 「わたぬき汁ってぼく知らない。」と云いました。ゴーシュはその顔を見て思
       │ わず吹き出そうとしましたが、まだ無理に恐い顔をして、
   3   │ 「では教えてやろう。わたぬき汁というのはな。おまえのようなわたぬきをな
       │ 、キャベジや塩とまぜてくたくたと煮ておれさまの食うようにしたものだ。」
       │ と云いました。
───────┴────────────────────────────────────────────────────────────────────────
───────┬────────────────────────────────────────────────────────────────────────
       │ File: result/3/result.txt
───────┼────────────────────────────────────────────────────────────────────────
   1   │ わたぬき たみすけ、1927年〈昭和2年〉4月30日 - とは、日本の実業家、政治
       │ 家、神職。自由民主党富山県連最高顧問。
```

たしかに、*たぬき* が *わたぬき* に変更されていますね。

勝手にチャンネルが分岐して複数のファイルを処理してくれています。個人的にはとても不思議な感じがします。

この記事は以上です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/05e38772-8c8c-788b-c244-16c5b59412d0.png)