我在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'循环可以为更长的文件列表实现此目的? 我希望组合文件内容,而不仅仅是文件名列表。
答案 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”来获得的。