CSVファイルの単一列を複数の列に分割する方法

CSVファイルの単一列を複数の列に分割する方法

私のcsvファイルには次のテキストがあり、csvファイルの別々の列にFILEとTIMESTAMPを入れる必要があります。これを達成する方法を教えてください。

FILE, TIMESTAMP
/u01/app/xxcus/12.0.0/mds/cvs/oracle/apps/xxcus/receipt/server/XxReceipt.java, Thu 28 Jun 2018 02:49:45 AM EDT
/u01/app/xxcus/12.0.0/mds/cvs/oracle/apps/xxcus/receipt/webui/XxReceiptCreateCO.java, Thu 28 Jun 2018 09:00:43 AM EDT
/u01/app/xxcus/12.0.0/mds/cvs/oracle/apps/xxcus/receipt/webui/XxOlympusReceiptPG.xml, Thu 28 Jun 2018 05:16:46 AM EDT
/u01/app/xxcus/12.0.0/reports/US/XX_POXRCPPV.rdf, Thu 28 Jun 2018 12:31:29 PM EDT
/u01/app/xxcus/12.0.0/reports/US/XX_POXRCIPS.rdf, Thu 28 Jun 2018 12:31:40 PM EDT

注:listコマンドを試しましたが、役に立ちませんでした。

答え1

sed道路

,␣カンマスペース()をファイル内のテーブルに置き換えるには、sedを介してその内容をパイプします。これは例です

$ echo '/apps/XxReceipt.java, Thu 28 Jun 2018 02:49:45 AM EDT' | sed 's:, :\t:g'
/apps/XxReceipt.java    Thu 28 Jun 2018 02:49:45 AM EDT

説明する:

  • 周囲の一重引用符は、s:, :\t:gsedに単一の引数として文字列を与えるようにシェルに指示します。
  • sedの場合、s最初の位置は交換を意味します。
  • :パターン/代替区切り記号。
  • ,␣似合うパターンです。
  • \tパターン置換です - テーブルのエスケープシーケンス
  • g(グローバル)は、sedに最初の行だけでなく、その行のすべての項目を置き換えるように指示します。

-Esedを使用してより複雑なパターンを一致させる必要がある場合は、パターンが正規表現として解釈されるようにスイッチを使用できます。各式にプレフィックスを追加すると、複数のsed式を連結できます-e

csvデータがファイルにある場合、sedを介してパイプする方法は次のとおりです。

cat my-data.csv | sed 's:, :\t:g' | tee my-data.tsv

または

cat my-data.csv | sed 's:, :\t:g' > my-data.tsv

答え2

私が質問を読む方法はあなたが望むものです作る与えられたファイルのリストをCSV形式で出力します。その他の説明については、この回答の最後をご覧ください。

以下は、これを実行できるシェルスクリプトです。 Linuxバージョンを使用して、stat最後に変更されたタイムスタンプを取得します。

#!/bin/sh

echo "PATHNAME,TIMESTAMP"
stat -c '"%n",%y' "$@"

ヘッダーを出力した後、スクリプトはコマンドラインに記載されているパス名を呼び出して、最後に変更されたタイムスタンプを取得します。これを変更する方法については、statシステムのマニュアルを参照してください。statパス名(引用符を含む)とタイムスタンプを印刷します。

次のように使用できます。

sh script.sh PATTERN >outputfile

たとえば、

$ sh script.sh *.log* *.tar >file.cvs

$ cat file.cvs
PATHNAME,TIMESTAMP
"dsmerror.log",2018-07-17 13:00:02.911711652 +0200
"dsminstr.log",2018-07-17 13:00:04.079726608 +0200
"dsminstr.log.bak",2018-05-13 18:00:03.231791181 +0200
"dsminstr.log.lock",2018-07-17 13:00:04.079726608 +0200
"archive_20170823-old.tar",2017-08-22 16:44:23.037803149 +0200
"archive_20170823.tar",2017-08-23 09:35:28.956158119 +0200
"archive_20180409.tar",2018-04-09 09:47:29.472374428 +0200
"archive-chr22.tar",2018-06-19 14:50:45.896447161 +0200
"gene_cache.tar",2018-04-25 09:44:15.518486626 +0200

スクリプトは非常に短いので、そのコマンドをコマンドラインに直接書き込むことができます。上記の例と同じコマンドラインは次のとおりです。

$ { echo "PATHNAME.TIMESTAMP"; stat -c '"%n",%y' *.log* *.tar; } >file.cvs

このファイルがあれば、レポート目的に合わせてフォーマットを適切に指定できます。

$ column -s, -t file.csv
PATHNAME                    TIMESTAMP
"dsmerror.log"              2018-07-17 13:00:02.911711652 +0200
"dsminstr.log"              2018-07-17 13:00:04.079726608 +0200
"dsminstr.log.bak"          2018-05-13 18:00:03.231791181 +0200
"dsminstr.log.lock"         2018-07-17 13:00:04.079726608 +0200
"archive_20170823-old.tar"  2017-08-22 16:44:23.037803149 +0200
"archive_20170823.tar"      2017-08-23 09:35:28.956158119 +0200
"archive_20180409.tar"      2018-04-09 09:47:29.472374428 +0200
"archive-chr22.tar"         2018-06-19 14:50:45.896447161 +0200
"gene_cache.tar"            2018-04-25 09:44:15.518486626 +0200

この方法は、パス名にカンマが含まれていない場合に機能します。

コンマを含むパス名も処理できるCSVパーサーを使用してフォーマットを正しく指定するには、次のようにします。

$ csvlook file.csv
| PATHNAME                 | TIMESTAMP                           |
| ------------------------ | ----------------------------------- |
| dsmerror.log             | 2018-07-17 13:00:02.911711652 +0200 |
| dsminstr.log             | 2018-07-17 13:00:04.079726608 +0200 |
| dsminstr.log.bak         | 2018-05-13 18:00:03.231791181 +0200 |
| dsminstr.log.lock        | 2018-07-17 13:00:04.079726608 +0200 |
| archive_20170823-old.tar | 2017-08-22 16:44:23.037803149 +0200 |
| archive_20170823.tar     | 2017-08-23 09:35:28.956158119 +0200 |
| archive_20180409.tar     | 2018-04-09 09:47:29.472374428 +0200 |
| archive-chr22.tar        | 2018-06-19 14:50:45.896447161 +0200 |
| gene_cache.tar           | 2018-04-25 09:44:15.518486626 +0200 |

csvlookの一部ですcsvkit、CSVファイルを処理するためのPythonツールキットです。

関連情報