我有许多同名的文本文件。每个文件保存在不同的文件夹中,并且每个文件包含一列数字,如下所示:
FILE.TXT FILE.TXT FILE.TXT FILE.TXT ....
5 4 5 7
8 2 1 5
6 1 1 1
1 3 5 9
3 1 8 9
. . . .
. . . .
. . . .
我想将文件合并到一个电子表格(CSV 格式)中,并且希望列的名称与包含该文件的文件夹的名称相同。我尝试了 for 循环,如下所示:
#!/bin/bash
in=a/b/c
for i in $(cat $in/folders_names.txt); do # i is the folder name that contain the file.txt
paste ${in}/${i}/file.txt
done > all_files.txt
sed 's/ */,/g' all_files.txt >all_files.csv &
此代码将所有列(来自所有文件)粘贴到一列中(在文件 all_files.txt 中)。我不知道我做错了什么。有什么建议么?
答案1
{ paste -d, /dev/null "${in}"/folders_names.txt | tr -d \\n | cut -c2-; \
sed 's|.*|'"${in}"'/&/file.txt|' "${in}"/folders_names.txt \
| tr \\n \\0 | xargs -0 paste -d,; } > all_files.csv
第一个命令
paste -d, /dev/null "${in}"/folders_names.txt | tr -d \\n | cut -c2-
打印标题,例如,如果您"${in}"/folders_names.txt
是:
w
x
y
z
它打印w,x,y,z
该sed
命令处理相同的文件,以便每一行都成为一个路径,例如如果in=a/b/c
:
a/b/c/w/file.txt
a/b/c/x/file.txt
a/b/c/y/file.txt
a/b/c/z/file.txt
结果被tr
转换为一个空分隔的输入,输入到paste
via xargs -0
,所以最终的输出是例如
w,x,y,z
5,4,5,7
8,2,1,5
6,1,1,1
1,3,5,9
3,1,8,9
如果包含的空白中没有行folders_names.txt
(即正常的文件名),您可以运行:
{ paste -d, /dev/null "${in}"/folders_names.txt | tr -d \\n | cut -c2-; \
paste -d, $(sed 's|.*|'"${in}"'/&/file.txt|' "${in}"/folders_names.txt); } > all_files.csv
因为第二个命令将扩展为
paste -d, a/b/c/w/file.txt a/b/c/x/file.txt a/b/c/y/file.txt a/b/c/z/file.txt