我正在编写一个连接到服务器的bash脚本,将数据导出到.csv文件,然后运行使用该新创建文件的jar。问题是,jar 要求文件名包含.csv文件中第一行的时间戳列的值。
这是我.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文件后,我怎么能...
- 从.csv文件的第一行中获取第一个时间戳
- 在我将保存.csv文件的文件名中使用该时间戳
我感谢您的帮助!
使用 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
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
例如,使用 GNU grep
:
ts=$(grep -Pom1 '(?<="Timestamp":")[^"]*' csv)
或带sed
:
ts=$(sed -n '1s/.*"Timestamp":"([^"]*).*/1/p' csv)
然后你可以做
mv csv "$ts.txt"
其中csv
是旧名称,2012-11-01T00:00:01+0000.txt
将是新名称。