Bash合并文件

时间:2018-11-29 09:56:48

标签: csv awk

我将合并多个.csv报告。

下载后,它会写成这样:

文件1。

Name Name Flavor
AAA  BBB  CCC
AAA  BBB  CCC

文件2。

Name Name Flavor
ACB  DHB  123

我尝试使用“ awk”命令。

awk 'FNR== 1{print ""}1' *.csv >> ReportsVol.csv 

与它们合并所有文件。 但是输出结果如下。

Name Name Flavor
AAA  BBB  CCC
AAA  BBB  CCC
Name Name Flavor
ACB  DHB  123

但是我希望每个文件之间都有一个日期。因此,我认为使用“时间戳”将可能实现,但是我不知道如何部署它们。 并且描述(名称,名称,风味)应该只写入文件顶部一次。

最后我想要这样的东西:

Name Name Flavor
 <timestamp>
AAA  BBB  CCC
ABC  BCD  CDE

<timestamp>
ACB  DHB  123

在此先感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

systime()将在您使用GNU awk时起作用,但是您可能会用该函数替换返回所需日期的函数。

awk 'NR==1;FNR==1{print systime(); next}1' file1 file2

返回

Name Name Flavor
1543486733
AAA  BBB  CCC
AAA  BBB  CCC
1543486733
ACB  DHB  123

我不知道您想要什么样的日期,所以我使用了systime()


编辑

使用文件的最后修改时间:

awk 'NR==1{printf "%s", $0};FNR==1{print ""; system("date -r" FILENAME); next}1' *.csv > ReportsVol.csv

返回:

Name Name Flavor
Thu Nov 29 11:11:49 CET 2018
AAA  BBB  CCC
AAA  BBB  CCC

Thu Nov 29 11:12:07 CET 2018
ACB  DHB  123

如果您希望日期格式自时代起以秒为单位,请使用system("date +%s -r " FILENAME)

如果不需要用空行分隔文件,请删除print "";

答案 1 :(得分:1)

请您尝试以下。

awk '
FNR==1{
  if(++count==1){
     print $0 ORS systime()
  }
  if(count==2){
     print systime()
  }
  next
}
1'   Input_file

答案 2 :(得分:1)

awk -v d="$(date)" 'FNR==1{print (NR==1 ? $0 : "") ORS d; next} 1' *.csv

根据需要指定date选项。