summaryrefslogtreecommitdiffhomepage
path: root/vhosts/blog/content/posts/2025-03-27/zip-function-like-command-paste-command.ndoc
blob: 3419099b42d69498592b2ae509a0829bce779fa9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
---
[article]
uuid = "99111377-27e7-427b-9dc5-a23f621fa826"
title = "zip 関数のようなコマンド paste"
description = "zip 関数のような動きをする paste コマンドについてのメモ。"
tags = [
  "note-to-self",
]

[[article.revisions]]
date = "2021-03-22"
remark = "デジタルサーカス株式会社の社内記事として公開"
isInternal = true

[[article.revisions]]
date = "2025-03-27"
remark = "ブログ記事として一般公開"
---
<article>
  <note>
    この記事は、2021-03-22 に<a href="https://www.dgcircus.com/">デジタルサーカス株式会社</a> の社内 Qiita Team に公開された記事をベースに、加筆修正して一般公開したものです。
  </note>
  <section id="intro">
    <h>実現したい内容</h>
    <p>
      次の2ファイル <code>a.txt</code> / <code>b.txt</code> から出力 <code>ab.txt</code> を得たい。
    </p>
    <p>
      <code>a.txt</code>
    </p>
    <codeblock>
    <![CDATA[
    a1
    a2
    a3
    ]]>
    </codeblock>
    <p>
      <code>b.txt</code>
    </p>
    <codeblock>
    <![CDATA[
    b1
    b2
    b3
    ]]>
    </codeblock>
    <p>
      <code>ab.txt</code>
    </p>
    <codeblock>
    <![CDATA[
    a1
    b1
    a2
    b2
    a3
    b3
    ]]>
    </codeblock>
    <p>
    ちょうど Python や Haskell などにある <code>zip</code> 関数のような動きをさせたい。
    </p>
  </section>
  <section id="paste-command">
    <h>実現方法</h>
    <p>
      記事タイトルに書いたように、<code>paste</code> コマンドを使うと実現できる。
    </p>
    <codeblock>
    <![CDATA[
    $ paste -d '\
    ' a.txt b.txt > ab.txt
    ]]>
    </codeblock>
    <p>
      <code>paste</code> コマンドは複数のファイルを引数に取り、それらを1行ずつ消費しながら <code>-d</code> で指定した文字で区切って出力する。
      <code>-d</code> は区切り文字の指定で、デフォルトだとタブ区切りになる。
    </p>
    <p>
      ファイル名には <code>-</code> を指定でき、その場合は標準入力から読み込んで出力する。
      このとき <code>paste - -</code> のように複数回 <code>-</code> を指定すると、指定した回数の行ごとに連結することができる。
      例えば <code>ab.txt</code> だとこうなる。
    </p>
    <codeblock>
    <![CDATA[
    $ paste - - < ab.txt
    a1	b1
    a2	b2
    a3	b3
    ]]>
    </codeblock>
    <p>
      これは標準入力を使うとき特有の挙動で、単に同じファイル名を指定してもこうはならない。
    </p>
    <codeblock>
    <![CDATA[
    $ paste ab.txt ab.txt
    a1	a1
    b1	b1
    a2	a2
    b2	b2
    a3	a3
    b3	b3
    ]]>
    </codeblock>
    <p>
      ときどき便利。
    </p>
  </section>
</article>