【问题标题】:csv file manipulation in unix and append value to each lineUnix中的csv文件操作并将值附加到每一行
【发布时间】:2019-01-14 22:53:59
【问题描述】:

我有以下 csv 文件

,,,Test File,
,todays Date:,01/10/2018,Generation date,10/01/2019 11:20:58
Header 1,Header 2,Header 3,Header 4,Header 5
,My account no,100102GFC,,
A,B,C,D,E
A,B,C,D,E
A,B,C,D,E
TEST

我需要提取第二行第三列中的今天日期 还有第4行第3列的帐号。

下面是我必须创建的新文件,那些提取的值 第 3 行和第 4 行需要附加在文件末尾。 新文件将包含第 4 行和第 n-1 行的数据

A,B,C,D,E,01/10/2018,100102GFC
A,B,C,D,E,01/10/2018,100102GFC
A,B,C,D,E,01/10/2018,100102GFC

请您帮我在 shell 脚本中做同样的事情吗?
这是我尝试过的,我是 shell 脚本的新手,无法结合所有这些

从第二行提取日期

sed -sn 2p test.csv| cut -d ',' -f  3

提取账号

sed -sn 3p test.csv| cut -d ',' -f  3

提取实际数据

tail -n +5 test.csv | head -n -1>temp.csv

【问题讨论】:

  • 请展示您目前所做的事情,SE 不是脚本服务。
  • @RomeoNinov 我也更新了

标签: linux shell awk sed


【解决方案1】:

试试awk:

awk -F, 'NR==2{d=$3}NR==4{a=$3}NR>4{if (line) print line; line = $0 "," d "," a;}' Inputfile.csv

例如:

$ cat file1
,,,Test File,
,todays Date:,01/10/2018,Generation date,10/01/2019 11:20:58
Header 1,Header 2,Header 3,Header 4,Header 5
,My account no,100102GFC,,
A,B,C,D,E
A,B,C,D,E
A,B,C,D,E
TEST

$ awk -F, 'NR==2{d=$3}NR==4{a=$3}NR>4{if (line) print line; line = $0 "," d "," a;}' file1
A,B,C,D,E,01/10/2018,100102GFC
A,B,C,D,E,01/10/2018,100102GFC
A,B,C,D,E,01/10/2018,100102GFC

在我编辑您的问题之前误解了您的意思,之后更新了我的答案。

awk 命令中:
NR 表示行号,-F 分配分隔符,d 存储日期a 帐户。
只需连接行@987654330 @ 与 da.
你不想要最后一行,所以我使用line 来延迟打印,最后一行不会打印出来(尽管它确实保存到line,如果给出END 块可以使用)。

【讨论】:

  • @Dawn 很高兴它有帮助:)
【解决方案2】:

你也可以试试 Perl

$ cat  dawn.txt
,,,Test File,
,todays Date:,01/10/2018,Generation date,10/01/2019 11:20:58
Header 1,Header 2,Header 3,Header 4,Header 5
,My account no,100102GFC,,
A,B,C,D,E
A,B,C,D,E
A,B,C,D,E
TEST

$ perl -F, -lane ' $dt=$F[2] if $.==2 ; $ac=$F[2] if $.==4; if($.>4 and ! eof) { print "$_,$dt,$ac" } ' dawn.txt
A,B,C,D,E,01/10/2018,100102GFC
A,B,C,D,E,01/10/2018,100102GFC
A,B,C,D,E,01/10/2018,100102GFC

$

【讨论】:

    【解决方案3】:
    $ cat tst.awk
    BEGIN { FS=OFS="," }
    NR == 2 { date = $3 }
    NR == 4 { acct = $3 }
    NR>4 && NF>1 { print $0, date, acct }
    
    $ awk -f tst.awk file
    A,B,C,D,E,01/10/2018,100102GFC
    A,B,C,D,E,01/10/2018,100102GFC
    A,B,C,D,E,01/10/2018,100102GFC
    

    或者,取决于您的要求和实际输入数据:

    $ cat tst.awk
    BEGIN { FS=OFS="," }
    NR == 2 { date = $3 }
    NR == 4 { acct = $3 }
    NR>4 {
        if (out != "") {
            print out
        }
        out = $0 OFS date OFS acct
    }
    
    $ awk -f tst.awk file
    A,B,C,D,E,01/10/2018,100102GFC
    A,B,C,D,E,01/10/2018,100102GFC
    A,B,C,D,E,01/10/2018,100102GFC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-26
      • 2018-11-04
      • 2020-09-10
      • 2020-06-16
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多