私の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:g
sedに単一の引数として文字列を与えるようにシェルに指示します。 - sedの場合、
s
最初の位置は交換を意味します。 :
パターン/代替区切り記号。,␣
似合うパターンです。\t
パターン置換です - テーブルのエスケープシーケンス- g(グローバル)は、sedに最初の行だけでなく、その行のすべての項目を置き換えるように指示します。
-E
sedを使用してより複雑なパターンを一致させる必要がある場合は、パターンが正規表現として解釈されるようにスイッチを使用できます。各式にプレフィックスを追加すると、複数の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ツールキットです。