如何从bash中的.csv文件的第一行获取特定列?

时间:2012-11-13 13:13:40

标签: linux bash shell awk

我正在编写一个连接到服务器的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文件的文件名中使用该时间戳
  3. 感谢你的帮助!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

例如,使用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将是新名称。

答案 2 :(得分:0)

awk oneliner一次性完成:

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

这将打印“mv”命令行。如果你想执行它,只需将输出管道输出为:

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