回答編集履歴

3

改行コード対応

2020/06/03 11:40

投稿

KojiDoi
KojiDoi

スコア13671

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
  ```
32
32
 
33
- (↑ 2020/06/04修正。headのパラメータ書式がlinuxとbusyboxでは違っていた…)
33
+ (↑ 2020/06/03修正。headのパラメータ書式がlinuxとbusyboxでは違っていた…)
34
34
 
35
35
 
36
36
 
@@ -188,7 +188,35 @@
188
188
 
189
189
 
190
190
 
191
+ ## 改行コードの違いを解決する(20-06-03追記)
192
+
193
+
194
+
195
+ busyboxが想定している改行コードとwindowsのそれが違っていることを忘れていました。
196
+
197
+
198
+
191
- 確かに出来ています。
199
+ * busybox: LF
200
+
201
+ * windows: CR+LF
202
+
203
+
204
+
205
+ 最後に各行末をチェックし、これをCR+LFに揃える措置が必要のようです。
206
+
207
+ スクリプトファイルの最終行を次のようにすると解決するはず。
208
+
209
+
210
+
211
+ ```
212
+
213
+ (head -n 1 ${infile} && tail -n +2 ${infile} | sort -k 2n,2 -k 1,1) | sed 's/\r$//; s/$/\r/' > ${outfile}
214
+
215
+ ```
216
+
217
+
218
+
219
+ # おわりに
192
220
 
193
221
 
194
222
 

2

脱字修正

2020/06/03 11:40

投稿

KojiDoi
KojiDoi

スコア13671

test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
 
58
58
 
59
- 私の環境では`d\mydocument`の下にいろいろtsvファイルが置いてあるので、これを試しにソートしてみることにします。まず普通にDOS窓からファイル内容を出力してみます。
59
+ 私の環境では`d:\mydocument`の下にいろいろtsvファイルが置いてあるので、これを試しにソートしてみることにします。まず普通にDOS窓からファイル内容を出力してみます。
60
60
 
61
61
 
62
62
 

1

実例を示す

2020/06/02 20:06

投稿

KojiDoi
KojiDoi

スコア13671

test CHANGED
@@ -26,9 +26,11 @@
26
26
 
27
27
  ```
28
28
 
29
- (head -n +1 input.tsv && tail -n +1 input.tsv|sort -t$'\t') > output.tsv
29
+ (head -n 1 input.tsv && tail -n +2 input.tsv|sort -t$'\t') > output.tsv
30
30
 
31
31
  ```
32
+
33
+ (↑ 2020/06/04修正。headのパラメータ書式がlinuxとbusyboxでは違っていた…)
32
34
 
33
35
 
34
36
 
@@ -43,3 +45,151 @@
43
45
  ```
44
46
 
45
47
  * [sortコマンド、基本と応用とワナ - Qiita](https://qiita.com/richmikan@github/items/cc4494359b1ac2f72311)
48
+
49
+
50
+
51
+ # 実例
52
+
53
+
54
+
55
+ busybox64.exeが既にpathの引かれたディレクトリに置かれていて、CMDのプロンプトから呼び出せる状況になっているとします。これだけでDOSプロンプト下でbashをはじめ、head, tail, awk, grep, sed, perl, sort ...などのツールが使えるようになります。
56
+
57
+
58
+
59
+ 私の環境では`d\mydocument`の下にいろいろtsvファイルが置いてあるので、これを試しにソートしてみることにします。まず普通にDOS窓からファイル内容を出力してみます。
60
+
61
+
62
+
63
+ ```
64
+
65
+ D:\mydocument>type test.tsv
66
+
67
+ ID Value
68
+
69
+ AA 1
70
+
71
+ ZZ 2
72
+
73
+ BB 20
74
+
75
+ CC 2
76
+
77
+ AA 2
78
+
79
+ AB 3
80
+
81
+ ```
82
+
83
+
84
+
85
+ busybox経由でとりあえずソートしてみます。1行目はそのまま、2行目以降を普通に文字列としてソートします。
86
+
87
+
88
+
89
+ ```
90
+
91
+ D:\mydocument>busybox64 bash -c "head -n 1 test.tsv && tail -n +2 test.tsv | sort"
92
+
93
+ ID Value
94
+
95
+ AA 1
96
+
97
+ AA 2
98
+
99
+ AB 3
100
+
101
+ BB 20
102
+
103
+ CC 2
104
+
105
+ ZZ 2
106
+
107
+ ```
108
+
109
+
110
+
111
+ 条件を少し複雑化して、2列目を数値キーとしてソートし、さらに1列目でソートしてみます。
112
+
113
+
114
+
115
+ ```
116
+
117
+ D:\mydocument>busybox64 bash -c "head -n 1 test.tsv && tail -n +2 test.tsv | sort -k 2n,2 -k 1,1"
118
+
119
+ ID Value
120
+
121
+ AA 1
122
+
123
+ AA 2
124
+
125
+ CC 2
126
+
127
+ ZZ 2
128
+
129
+ AB 3
130
+
131
+ BB 20
132
+
133
+ ```
134
+
135
+
136
+
137
+ 毎回これらのコマンドを打ち込むのは面倒なのでシェルスクリプトにしてみます。
138
+
139
+ 次のような内容のファイルを作成してsorttest.shという名前で保存します。
140
+
141
+
142
+
143
+ ```
144
+
145
+ #!/bin/sh
146
+
147
+ infile=$1
148
+
149
+ outfile=${infile}.out
150
+
151
+ (head -n 1 ${infile} && tail -n +2 ${infile} | sort -k 2n,2 -k 1,1) > ${outfile}
152
+
153
+ ```
154
+
155
+
156
+
157
+ とりあえず、コマンドラインから対象ファイル名を読み取り、その後ろに`.out`をつけた名前のファイルにソート結果をセーブするという仕様としてあります。
158
+
159
+
160
+
161
+ 実行してみます。
162
+
163
+
164
+
165
+ ```
166
+
167
+ D:\mydocument>busybox64 bash sorttest.sh test.tsv
168
+
169
+
170
+
171
+ D:\mydocument>type test.tsv.out
172
+
173
+ ID Value
174
+
175
+ AA 1
176
+
177
+ AA 2
178
+
179
+ CC 2
180
+
181
+ ZZ 2
182
+
183
+ AB 3
184
+
185
+ BB 20
186
+
187
+ ```
188
+
189
+
190
+
191
+ 確かに出来ています。
192
+
193
+
194
+
195
+ というわけで、busyboxの存在はもっと知られてもいいのではないかと思う次第です。より本格的にやりたければMSYS2とかWindows Subsystem for Linuxを考えるべきですが、ファイルをたった一個ダウンロードしてくるだけで準備完了という手軽さは、他の追随を許さない美点と言えます。