如何解决合并csv文件时,awk参数过长
我在一个文件夹中有超过10000个csv文件,我正在尝试使用awk逐行合并它们,但是如果我运行以下命令:printf '%s\n' *.csv | xargs cat | awk 'FNR==1 && NR!=1{next;}{print}' *.csv > master.csv
我收到以下错误:
/ usr / bin / awk:参数列表太长 和 printf:写入错误:管道损坏
解决方法
使用printf
和xargs
部分,您将csv文件的内容发送到awk,但是您还提供了awk的文件名。选择一个或另一个:我建议:
{ printf '%s\n' *.csv | xargs awk 'FNR==1 && NR!=1{next;}{print}'; } > master.csv
,
如果文件名不包含换行符,则可以这样做:
printf '%s\n' *.csv | awk 'NR==FNR{ARGV[ARGC++]=$0; next} !c++ || FNR>1' -
或者如果它们可以包含换行符,则:
printf '%s\0' *.csv | awk -v RS='\0' 'NR==FNR{ARGV[ARGC++]=$0; next} !c++ || FNR>1' RS='\0' - RS='\n'
即让awk读取CSV文件名列表作为输入,而不是将其作为参数传递给awk的shell。即使您拥有数百万个CSV文件,也可以使用。
例如,输入以下内容:
$ head -n +50 file*.csv
==> file1.csv <==
Number
1
2
==> file2.csv <==
Number
10
11
12
以上将产生以下输出:
$ printf '%s\n' *.csv | awk 'NR==FNR{ARGV[ARGC++]=$0; next} !c++ || FNR>1' -
Number
1
2
10
11
12
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。