使用循环合并文件列表(bash)

时间:2014-10-06 16:03:42

标签: bash loops merge cat

我在bash(Fedora)工作。 我有一个文本文件列表如下:

filenameA   filename1
filenameA   filename2
filenameA   filename3
filenameB   filename4
filenameB   filename5

我希望将第二列中列出的所有文件与第一列中的匹配组合(cat),如下所示:

cat filenameA filename1 filename2 filename3  > newfilenameA 
cat filenameB filename4 filename5 > newfilenameB

是否有'while'或'for'循环可以为更长的文件列表实现此目的? 我希望组合文件内容,而不仅仅是文件名列表。

1 个答案:

答案 0 :(得分:3)

我建议您使用awk:

awk '{a[$1]=a[$1] OFS $2}END{for(i in a)system("cat " i OFS a[i] " >new" i)}' file

第一个块根据第二列的值对条目进行分组。这些条目由输出字段分隔符OFS分隔,默认为空格。

END块中,一旦处理完文件中的所有行,循环将遍历a的每个元素,使用system运行cat在壳中。在awk中,默认情况下串联串联,因此可以通过将数组键i和值a[i]连接在一起来构建命令字符串。 cat的输出被重定向到一个文件,其名称是通过在输入文件名前添加“new”来获得的。