0

我正在编写一个连接到服务器的 bash 脚本,将数据导出到 .csv 文件,然后运行一个使用该新创建文件的 jar。问题是,jar 要求文件名包含 .csv 文件中第一行的 Timestamp 列的值。

这是我的 .csv 文件的第一行。在这种情况下,时间戳是位于行尾的2012-11-01 。

"####<Nov 1, 2012 12:00:01 AM UTC> <Warning> <AesoRMQAdapter::RabbitMQAdapter> <> <myServer> <[ACTIVE] ExecuteThread: '7' for queue: 'weblogic.kernel.Default (self-tuning)'> <> <> <> <1351728001726> <BEA-000000> <DEBUG SEND MESSAGE={"Volume":55.1,"OfferedVolume":54.8,"ArmedVolume":0.0,"Status":false,"BlockNr":0,"Timestamp":"2012-11-01T00:00:01+0000"}> "

我的问题如下。

检索 .csv 文件后,我该如何...

  1. 从 .csv 文件的第一行中获取第一个时间戳
  2. 在我将保存 .csv 文件的文件名中使用该时间戳

感谢您的所有帮助!

4

3 回答 3

2

用于head -1从输入文件中仅获取一行,然后grep -o检索该行中的所有时间戳,然后head -1仅保留第一行。

$ date=`cat myfile.csv | head -1 | grep -o -e "[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}" | head -1`
$ echo $date
2012-11-01
$ mv myfile.csv myfile.$date.csv
于 2012-11-13T13:24:01.290 回答
0

例如,使用GNU grep

ts=$(grep -Pom1 '(?<="Timestamp":")[^"]*' csv)

或与sed

ts=$(sed -n '1s/.*"Timestamp":"\([^"]*\).*/\1/p' csv)

然后你可以做

mv csv "$ts.txt"

旧名称在哪里csv2012-11-01T00:00:01+0000.txt将是新名称。

于 2012-11-13T13:21:58.457 回答
0

awk oneliner 一次性完成:

awk -F':"' 'NR==1{split($NF,t,"T");print "mv "FILENAME" "t[1]".csv"}' file.csv

这将打印“mv”命令行。如果要执行它,只需将输出通过管道传输到 sh ,如下所示:

awk ..... |sh

测试:

kent$  cat dummy.csv 
"####<Nov 1, 2012 12:00:01 AM UTC> <Warning> <AesoRMQAdapter::RabbitMQAdapter> <> <myServer> <[ACTIVE] ExecuteThread: '7' for queue: 'weblogic.kernel.Default (self-tuning)'> <> <> <> <1351728001726> <BEA-000000> <DEBUG SEND MESSAGE={"Volume":55.1,"OfferedVolume":54.8,"ArmedVolume":0.0,"Status":false,"BlockNr":0,"Timestamp":"2012-11-01T00:00:01+0000"}> "
foo;bar;blah

kent$  awk -F':"' 'NR==1{split($NF,t,"T");print "mv "FILENAME" "t[1]".csv"}' dummy.csv
mv dummy.csv 2012-11-01.csv
于 2012-11-13T13:25:38.703 回答