回答編集履歴
3
改行コード対応
answer
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
```
|
15
15
|
(head -n 1 input.tsv && tail -n +2 input.tsv|sort -t$'\t') > output.tsv
|
16
16
|
```
|
17
|
-
(↑ 2020/06/
|
17
|
+
(↑ 2020/06/03修正。headのパラメータ書式がlinuxとbusyboxでは違っていた…)
|
18
18
|
|
19
19
|
sortの段階で複数キーを使うことも自由に出来ます。例えば、第4カラムを数値キーとしてソートし、さらに第1カラムを文字列としてソートしたいならこんな感じで。
|
20
20
|
|
@@ -93,6 +93,20 @@
|
|
93
93
|
BB 20
|
94
94
|
```
|
95
95
|
|
96
|
-
|
96
|
+
## 改行コードの違いを解決する(20-06-03追記)
|
97
97
|
|
98
|
+
busyboxが想定している改行コードとwindowsのそれが違っていることを忘れていました。
|
99
|
+
|
100
|
+
* busybox: LF
|
101
|
+
* windows: CR+LF
|
102
|
+
|
103
|
+
最後に各行末をチェックし、これをCR+LFに揃える措置が必要のようです。
|
104
|
+
スクリプトファイルの最終行を次のようにすると解決するはず。
|
105
|
+
|
106
|
+
```
|
107
|
+
(head -n 1 ${infile} && tail -n +2 ${infile} | sort -k 2n,2 -k 1,1) | sed 's/\r$//; s/$/\r/' > ${outfile}
|
108
|
+
```
|
109
|
+
|
110
|
+
# おわりに
|
111
|
+
|
98
112
|
というわけで、busyboxの存在はもっと知られてもいいのではないかと思う次第です。より本格的にやりたければMSYS2とかWindows Subsystem for Linuxを考えるべきですが、ファイルをたった一個ダウンロードしてくるだけで準備完了という手軽さは、他の追随を許さない美点と言えます。
|
2
脱字修正
answer
CHANGED
@@ -27,7 +27,7 @@
|
|
27
27
|
|
28
28
|
busybox64.exeが既にpathの引かれたディレクトリに置かれていて、CMDのプロンプトから呼び出せる状況になっているとします。これだけでDOSプロンプト下でbashをはじめ、head, tail, awk, grep, sed, perl, sort ...などのツールが使えるようになります。
|
29
29
|
|
30
|
-
私の環境では`d\mydocument`の下にいろいろtsvファイルが置いてあるので、これを試しにソートしてみることにします。まず普通にDOS窓からファイル内容を出力してみます。
|
30
|
+
私の環境では`d:\mydocument`の下にいろいろtsvファイルが置いてあるので、これを試しにソートしてみることにします。まず普通にDOS窓からファイル内容を出力してみます。
|
31
31
|
|
32
32
|
```
|
33
33
|
D:\mydocument>type test.tsv
|
1
実例を示す
answer
CHANGED
@@ -12,12 +12,87 @@
|
|
12
12
|
tsvファイルの一行目はそのまま、2行目以降をソートして新たなファイルとするには次のようなワンライナーが使えます。
|
13
13
|
|
14
14
|
```
|
15
|
-
(head -n
|
15
|
+
(head -n 1 input.tsv && tail -n +2 input.tsv|sort -t$'\t') > output.tsv
|
16
16
|
```
|
17
|
+
(↑ 2020/06/04修正。headのパラメータ書式がlinuxとbusyboxでは違っていた…)
|
17
18
|
|
18
19
|
sortの段階で複数キーを使うことも自由に出来ます。例えば、第4カラムを数値キーとしてソートし、さらに第1カラムを文字列としてソートしたいならこんな感じで。
|
19
20
|
|
20
21
|
```
|
21
22
|
(head -n +1 input.tsv && tail -n +1 input.tsv|sort -t$'\t' -k 4n,4 -k 1) > output.tsv
|
22
23
|
```
|
23
|
-
* [sortコマンド、基本と応用とワナ - Qiita](https://qiita.com/richmikan@github/items/cc4494359b1ac2f72311)
|
24
|
+
* [sortコマンド、基本と応用とワナ - Qiita](https://qiita.com/richmikan@github/items/cc4494359b1ac2f72311)
|
25
|
+
|
26
|
+
# 実例
|
27
|
+
|
28
|
+
busybox64.exeが既にpathの引かれたディレクトリに置かれていて、CMDのプロンプトから呼び出せる状況になっているとします。これだけでDOSプロンプト下でbashをはじめ、head, tail, awk, grep, sed, perl, sort ...などのツールが使えるようになります。
|
29
|
+
|
30
|
+
私の環境では`d\mydocument`の下にいろいろtsvファイルが置いてあるので、これを試しにソートしてみることにします。まず普通にDOS窓からファイル内容を出力してみます。
|
31
|
+
|
32
|
+
```
|
33
|
+
D:\mydocument>type test.tsv
|
34
|
+
ID Value
|
35
|
+
AA 1
|
36
|
+
ZZ 2
|
37
|
+
BB 20
|
38
|
+
CC 2
|
39
|
+
AA 2
|
40
|
+
AB 3
|
41
|
+
```
|
42
|
+
|
43
|
+
busybox経由でとりあえずソートしてみます。1行目はそのまま、2行目以降を普通に文字列としてソートします。
|
44
|
+
|
45
|
+
```
|
46
|
+
D:\mydocument>busybox64 bash -c "head -n 1 test.tsv && tail -n +2 test.tsv | sort"
|
47
|
+
ID Value
|
48
|
+
AA 1
|
49
|
+
AA 2
|
50
|
+
AB 3
|
51
|
+
BB 20
|
52
|
+
CC 2
|
53
|
+
ZZ 2
|
54
|
+
```
|
55
|
+
|
56
|
+
条件を少し複雑化して、2列目を数値キーとしてソートし、さらに1列目でソートしてみます。
|
57
|
+
|
58
|
+
```
|
59
|
+
D:\mydocument>busybox64 bash -c "head -n 1 test.tsv && tail -n +2 test.tsv | sort -k 2n,2 -k 1,1"
|
60
|
+
ID Value
|
61
|
+
AA 1
|
62
|
+
AA 2
|
63
|
+
CC 2
|
64
|
+
ZZ 2
|
65
|
+
AB 3
|
66
|
+
BB 20
|
67
|
+
```
|
68
|
+
|
69
|
+
毎回これらのコマンドを打ち込むのは面倒なのでシェルスクリプトにしてみます。
|
70
|
+
次のような内容のファイルを作成してsorttest.shという名前で保存します。
|
71
|
+
|
72
|
+
```
|
73
|
+
#!/bin/sh
|
74
|
+
infile=$1
|
75
|
+
outfile=${infile}.out
|
76
|
+
(head -n 1 ${infile} && tail -n +2 ${infile} | sort -k 2n,2 -k 1,1) > ${outfile}
|
77
|
+
```
|
78
|
+
|
79
|
+
とりあえず、コマンドラインから対象ファイル名を読み取り、その後ろに`.out`をつけた名前のファイルにソート結果をセーブするという仕様としてあります。
|
80
|
+
|
81
|
+
実行してみます。
|
82
|
+
|
83
|
+
```
|
84
|
+
D:\mydocument>busybox64 bash sorttest.sh test.tsv
|
85
|
+
|
86
|
+
D:\mydocument>type test.tsv.out
|
87
|
+
ID Value
|
88
|
+
AA 1
|
89
|
+
AA 2
|
90
|
+
CC 2
|
91
|
+
ZZ 2
|
92
|
+
AB 3
|
93
|
+
BB 20
|
94
|
+
```
|
95
|
+
|
96
|
+
確かに出来ています。
|
97
|
+
|
98
|
+
というわけで、busyboxの存在はもっと知られてもいいのではないかと思う次第です。より本格的にやりたければMSYS2とかWindows Subsystem for Linuxを考えるべきですが、ファイルをたった一個ダウンロードしてくるだけで準備完了という手軽さは、他の追随を許さない美点と言えます。
|