blob: eddb2e7721430c86fc1e2fc417005f84f7072fdf (
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
<!DOCTYPE html>
<html lang="ja-JP">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="nsfisis">
<meta name="copyright" content="© 2025 nsfisis">
<meta name="description" content="zip 関数のような動きをする paste コマンドについてのメモ。">
<meta name="keywords" content="備忘録">
<meta property="og:type" content="article">
<meta property="og:title" content="zip 関数のようなコマンド paste|REPL: Rest-Eat-Program Loop">
<meta property="og:description" content="zip 関数のような動きをする paste コマンドについてのメモ。">
<meta property="og:site_name" content="REPL: Rest-Eat-Program Loop">
<meta property="og:locale" content="ja_JP">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>zip 関数のようなコマンド paste|REPL: Rest-Eat-Program Loop</title>
<link rel="stylesheet" href="/style.css?h=8415c13be008f55a351b69c568b3e8ed">
</head>
<body class="single">
<header class="header">
<div class="site-logo">
<a href="/">REPL: Rest-Eat-Program Loop</a>
</div>
<nav class="nav">
<ul>
<li>
<a href="/about/">About</a>
</li>
<li>
<a href="/posts/">Posts</a>
</li>
<li>
<a href="/slides/">Slides</a>
</li>
<li>
<a href="/tags/">Tags</a>
</li>
</ul>
</nav>
</header>
<main class="main">
<article class="post-single">
<header class="post-header">
<h1 class="post-title">zip 関数のようなコマンド paste</h1>
<ul class="post-tags">
<li class="tag">
<a href="/tags/note-to-self/">備忘録</a>
</li>
</ul>
</header>
<div class="post-content">
<section id="changelog">
<h2><a href="#changelog">更新履歴</a></h2>
<ol>
<li class="revision">
<time datetime="2021-03-22">2021-03-22</time>: デジタルサーカス株式会社の社内記事として公開
</li>
<li class="revision">
<time datetime="2025-03-27">2025-03-27</time>: ブログ記事として一般公開
</li>
</ol>
</section>
<div class="admonition">
<div class="admonition-label">
NOTE
</div>
<div class="admonition-content">
<p>
この記事は、2021-03-22 に <a href="https://www.dgcircus.com/" rel="noreferrer" target="_blank">デジタルサーカス株式会社</a> の社内 Qiita Team に公開された記事をベースに、加筆修正して一般公開したものです。
</p>
</div>
</div>
<section id="section--intro">
<h2><a href="#section--intro">実現したい内容</a></h2>
<p>
次の2ファイル <code>a.txt</code> / <code>b.txt</code> から出力 <code>ab.txt</code> を得たい。
</p>
<p>
<code>a.txt</code>
</p>
<div class="codeblock">
<pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span>a1</span></span>
<span class="line"><span>a2</span></span>
<span class="line"><span>a3</span></span></code></pre>
</div>
<p>
<code>b.txt</code>
</p>
<div class="codeblock">
<pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span>b1</span></span>
<span class="line"><span>b2</span></span>
<span class="line"><span>b3</span></span></code></pre>
</div>
<p>
<code>ab.txt</code>
</p>
<div class="codeblock">
<pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span>a1</span></span>
<span class="line"><span>b1</span></span>
<span class="line"><span>a2</span></span>
<span class="line"><span>b2</span></span>
<span class="line"><span>a3</span></span>
<span class="line"><span>b3</span></span></code></pre>
</div>
<p>
ちょうど Python や Haskell などにある <code>zip</code> 関数のような動きをさせたい。
</p>
</section>
<section id="section--paste-command">
<h2><a href="#section--paste-command">実現方法</a></h2>
<p>
記事タイトルに書いたように、<code>paste</code> コマンドを使うと実現できる。
</p>
<div class="codeblock">
<pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span>$ paste -d '\</span></span>
<span class="line"><span>' a.txt b.txt > ab.txt</span></span></code></pre>
</div>
<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>
<div class="codeblock">
<pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span>$ paste - - < ab.txt</span></span>
<span class="line"><span>a1 b1</span></span>
<span class="line"><span>a2 b2</span></span>
<span class="line"><span>a3 b3</span></span></code></pre>
</div>
<p>
これは標準入力を使うとき特有の挙動で、単に同じファイル名を指定してもこうはならない。
</p>
<div class="codeblock">
<pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span>$ paste ab.txt ab.txt</span></span>
<span class="line"><span>a1 a1</span></span>
<span class="line"><span>b1 b1</span></span>
<span class="line"><span>a2 a2</span></span>
<span class="line"><span>b2 b2</span></span>
<span class="line"><span>a3 a3</span></span>
<span class="line"><span>b3 b3</span></span></code></pre>
</div>
<p>
ときどき便利。
</p>
</section>
</div>
</article>
</main>
<footer class="footer">
© 2021 nsfisis
</footer>
</body>
</html>
|