合并*.csv文件,并使用awk在终端中将文件名添加为一列

合并*.csv文件,并使用awk在终端中将文件名添加为一列,csv,awk,Csv,Awk,小结:我有将近500个*.csv文件需要合并到一个csv文件中,在合并过程中,需要在新列的每一行中添加每个csv的文件名 我在这里读了很多关于stackoverflow和其他方面的文章。我正在尝试在终端中执行此操作(不是在终端中运行的脚本)。这是我到目前为止所拥有的。当我运行这个终端时,它返回“for quote>”并且没有完成。我希望有人能很容易地指导我 for f in *.csv; do awk -f ' { x=1 ; if ( x == NR ) { print "date

小结:我有将近500个*.csv文件需要合并到一个csv文件中,在合并过程中,需要在新列的每一行中添加每个csv的文件名

我在这里读了很多关于stackoverflow和其他方面的文章。我正在尝试在终端中执行此操作(不是在终端中运行的脚本)。这是我到目前为止所拥有的。当我运行这个终端时,它返回“for quote>”并且没有完成。我希望有人能很容易地指导我

for f in *.csv; do awk -f  ' { x=1 ; if ( x == NR ) { print "date,ProductNumber,Brand,Description,Size,UnitType,Pack,UPC,Available,Status,Delivery Due Date"  } else { gsub(".csv","",FILENAME); print FILENAME","$0 }  }  “$f”  >  “output$f”; done
每个csv文件的结构相同,以下是一些示例数据:

ProductNumber,Brand,Description,Size,UnitType,Pack,UPC,Available,Status,Delivery Due Date
="0100503","BARNEY BUTTER","ALMOND BTR,SMOOTH","16 OZ   ","CS","   6",="0094922553584","    99","Active","          "
="0100701","NATRALIA","BODY LOTION,DRY SKIN","8.45 FZ ","EA","   1",="0835787000765","    33","Active","          "
="0101741","SAN PELLEGRINO","SPRKLNG BEV,ARANCIATA,ROS","6/11.15F","CS","   4",="0041508300360","     0","Active","          "
awk-vofs=,'
FNR==1{
打印“日期、产品编号、品牌、说明、尺寸、单位类型、包装、UPC、可用、状态、交货截止日期”
file=文件名
子(/.csv$/,“”,文件)
}
{打印文件,$0}
'*.csv>out.csv
如果文件列表太长,则

find-名称'*.csv'-print0 | xargs-0 awk'…'>out.csv

在文件中包含awk代码时使用
-f
awk-f script.awk文件…
我认为OP只希望打印一次标题,并且它已经存在于输入中,因此不需要硬编码,只需在
文件
前面加上前缀:
如果(NR==1)打印“文件”,则$0
。如果文件名列表太长,
find | xargs
将无法正常工作,因为在当前的xargs迭代中无法区分第一个文件和第一个文件,但我认为总共不会有500个文件。如果只需要一个heaer,则从awk
{echo“header”中取出头;查找…| xargs awk'…';}>out.txt
好主意,我想用指示哪些行是从xargs调用的awk中的标题来装饰输出,然后将所有输出管道化到一个awk脚本,该脚本只打印第一个指示的标题行,并删除前面调用添加的装饰,但您所说的要简单得多!