teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

改行コード対応

2020/06/03 11:40

投稿

KojiDoi
KojiDoi

スコア13727

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/04修正。headのパラメータ書式がlinuxとbusyboxでは違っていた…)
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

脱字修正

2020/06/03 11:40

投稿

KojiDoi
KojiDoi

スコア13727

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

実例を示す

2020/06/02 20:06

投稿

KojiDoi
KojiDoi

スコア13727

answer CHANGED
@@ -12,12 +12,87 @@
12
12
  tsvファイルの一行目はそのまま、2行目以降をソートして新たなファイルとするには次のようなワンライナーが使えます。
13
13
 
14
14
  ```
15
- (head -n +1 input.tsv && tail -n +1 input.tsv|sort -t$'\t') > output.tsv
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を考えるべきですが、ファイルをたった一個ダウンロードしてくるだけで準備完了という手軽さは、他の追随を許さない美点と言えます。