pasteコマンドでcsvを作成する方法をご紹介します。
以下の例でみてみます。
1 2 3 4 5 6 7 |
$ echo hiduke > /tmp/1.txt $ cat /tmp/2.txt Sun Jan 18 12:58:07 JST 2024 Sun Jan 18 12:58:07 JST 2024 Sun Jan 18 12:58:07 JST 2024 Sun Jan 18 12:58:07 JST 2024 $ |
/tmp/1.txtは1行、/tmp/2.txtは4行です。
この2つのファイルにpasteコマンドを実行してみます。
1 2 3 4 5 6 |
$ paste /tmp/1.txt /tmp/2.txt hiduke Sun Jan 18 12:58:07 JST 2024 Sun Jan 18 12:58:07 JST 2024 Sun Jan 18 12:58:07 JST 2024 Sun Jan 18 12:58:07 JST 2024 $ |
/tmp/1.txtの横に、/tmp/2.txtの結果がくっついています。
これをcsvに変えてみましょう。
pasteコマンドの区切りはタブ区切りになっているので、タブをカンマに変換します。
変換にはsedを使用します。タブは「\t」です。
1 2 3 4 5 6 |
$ paste /tmp/1.txt /tmp/2.txt | sed "s/\t/,/g" hiduke,Sun Jan 28 12:58:07 JST 2024 ,Sun Jan 28 12:58:07 JST 2024 ,Sun Jan 28 12:58:07 JST 2024 ,Sun Jan 28 12:58:07 JST 2024 $ |
タブがカンマに変わりました。
ただ、この場合はファイルの中にタブが含まれているとうまく動作しません。
pasteコマンドにはデリミタを変更するオプション(-dもしくは–delimiters)がありますので、それを使うほうが確実ですね
オプションはコマンドの最後でも問題ありません。
1 2 3 4 5 6 |
$ paste /tmp/1.txt /tmp/2.txt --delimiters , hiduke,Sun Jan 28 12:58:07 JST 2024 ,Sun Jan 28 12:58:07 JST 2024 ,Sun Jan 28 12:58:07 JST 2024 ,Sun Jan 28 12:58:07 JST 2024 $ |
pasteの後ろに指定する場合。
1 2 3 4 5 6 |
$ paste -d , /tmp/1.txt /tmp/2.txt hiduke,Sun Jan 28 12:58:07 JST 2024 ,Sun Jan 28 12:58:07 JST 2024 ,Sun Jan 28 12:58:07 JST 2024 ,Sun Jan 28 12:58:07 JST 2024 $ |
引数の途中に指定することも可能です。
1 2 3 4 5 6 |
$ paste /tmp/1.txt -d , /tmp/2.txt hiduke,Sun Jan 28 12:58:07 JST 2024 ,Sun Jan 28 12:58:07 JST 2024 ,Sun Jan 28 12:58:07 JST 2024 ,Sun Jan 28 12:58:07 JST 2024 $ |
簡単にcsvを作ることができます。