合并*.csv文件,并使用awk在终端中将文件名添加为一列
小结:我有将近500个*.csv文件需要合并到一个csv文件中,在合并过程中,需要在新列的每一行中添加每个csv的文件名 我在这里读了很多关于stackoverflow和其他方面的文章。我正在尝试在终端中执行此操作(不是在终端中运行的脚本)。这是我到目前为止所拥有的。当我运行这个终端时,它返回“for quote>”并且没有完成。我希望有人能很容易地指导我合并*.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
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脚本,该脚本只打印第一个指示的标题行,并删除前面调用添加的装饰,但您所说的要简单得多!