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

Linux 如何在bash中从.csv文件的第一行获取特定列?,linux,bash,shell,awk,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> <> <my

我正在编写一个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文件后,我如何

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

  • 我感谢你的帮助

    例如,使用
    GNU grep

    ts=$(grep -Pom1 '(?<="Timestamp":")[^"]*' csv)
    
    那你就可以了

    mv csv "$ts.txt"
    

    其中,
    csv
    是旧名称,
    2012-11-01T00:00:01+0000.txt
    将是新名称。

    使用
    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
    "####            "
    傅;酒吧;废话
    kent$awk-F':“'NR==1{split($NF,t,t”);打印“mv”文件名“t[1]”.csv“}”dummy.csv
    mv dummy.csv 2012-11-01.csv
    
    如果同一行中有两个时间戳,
    将不起作用。
    echo'“Timestamp”:“2012-10-12”“Timestamp”:“2012-10-13”| grep-Pom1'(?@jviveno仅当两者前面都有
    “Timestamp”时才起作用":
    。问题中没有提到这种可能性。如果可能,我会让OP确认。无论如何,在这种情况下,
    sed
    版本将返回最后一个匹配项,
    grep
    命令可以通过管道传输到
    tail-1
    以获得最后一个匹配项。要获得第一个匹配项,只需在en处添加
    1
    使用
    sed
    命令(
    1s/../..//1p
    )或将
    head-1
    grep
    一起使用。如果文件名中有特殊字符,此操作将失败。
    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