使用循环(bash)合并文件列表
我在bash Fedora工作。 我有一个文本文件列表,如下所示:使用循环(bash)合并文件列表,bash,loops,merge,cat,Bash,Loops,Merge,Cat,我在bash Fedora工作。 我有一个文本文件列表,如下所示: filenameA filename1 filenameA filename2 filenameA filename3 filenameB filename4 filenameB filename5 我希望将第二列中列出的所有文件与其在第一列中的匹配项结合起来,如下所示: cat filenameA filename1 filename2 filename3 > newfilenameA cat
filenameA filename1
filenameA filename2
filenameA filename3
filenameB filename4
filenameB filename5
我希望将第二列中列出的所有文件与其在第一列中的匹配项结合起来,如下所示:
cat filenameA filename1 filename2 filename3 > newfilenameA
cat filenameB filename4 filename5 > newfilenameB
是否有一个“while”或“for”循环可以在更长的文件列表中实现这一点?
我希望合并文件内容,而不仅仅是文件名列表 我建议您使用awk:
awk '{a[$1]=a[$1] OFS $2}END{for(i in a)system("cat " i OFS a[i] " >new" i)}' file
第一个块根据第二列的值对条目进行分组。条目由OFS分隔,OFS是输出字段分隔符,默认为空格
在END块中,一旦文件中的所有行都被处理完毕,循环将遍历一个文件的每个元素,使用系统在shell中运行cat。在awk中,默认情况下串接字符串,因此可以通过将数组键i和值a[i]连接在一起来构建命令字符串。cat的输出被重定向到一个文件,该文件的名称是通过在输入文件名前加上new来获得的。I不清楚。期望输出。我希望合并文件内容。上面的解决方案为我提供了一个新的文件名,但不是文件内容。谢谢编辑中的代码在最后一个引号处给出了-awk cmd syntax error-unterminated字符串。我认为它缺少一个引号。它运行得很好,只是最后我必须按ctrl-c来结束挂断。这可能是因为您的输入中有一些空行。如果需要的话,可以在脚本中添加一个检查或删除空白行。