![bash で txt ファイルの行を Excel 列に分割する](https://rvso.com/image/1070318/bash%20%E3%81%A7%20txt%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%A1%8C%E3%82%92%20Excel%20%E5%88%97%E3%81%AB%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B.png)
次のようなテキスト ファイル (lines.txt) があります。
ab.qq
1
2
3
cd.qq
3
4
5
ef.qq
7
8
9
そして、Excel/CSV ファイル内の 4 行目ごとに別の列に移動しようとしています。基本的に、この bash スクリプトで印刷されるのは次のようになります。
#!/bin/bash
split -l 4 lines.txt outsq
paste -d ' ' outsq*
ab.qq cd.qq ef.qq
1 3 7
2 4 8
3 5 9
これを Excel/CSV ファイルに書き込む際に助けていただければ幸いです。また、結果を生成する他の方法 (分割/貼り付けなし) でも問題ありません。
答え1
(rs
resもともと BSD から派生した hape ユーティリティは、このような場合に便利です。
例えば:
$ rs -e -t 4 0 < lines.txt
ab.qq cd.qq ef.qq
1 3 7
2 4 8
3 5 9
どこ
-e
入力の各行を要素として扱うように指示する-t
列を行に転置する4 0
4行と必要な数の列を出力します。
およびオプション-c
は-C
それぞれ入力と出力の区切り文字を設定します。CSV出力の場合は、
$ rs -etC, 4 0 < lines.txt
ab.qq,cd.qq,ef.qq,
1,3,7,
2,4,8,
3,5,9,
rs
Ubuntu リポジトリから同じ名前のパッケージとして入手できますuniverse
。
あるいは、awk で次のようにすることもできます。
$ awk '
{a[NR%4] = a[NR%4] == "" ? $0 : a[NR%4] "," $0}
END {for(i=1;i<=4;i++) print a[i%4]}
' lines.txt
ab.qq,cd.qq,ef.qq
1,3,7
2,4,8
3,5,9