使用目录名作为列名粘贴同名的单列文件

使用目录名作为列名粘贴同名的单列文件

我有许多同名的文本文件。每个文件保存在不同的文件夹中,并且每个文件包含一列数字,如下所示:

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转换为一个空分隔的输入,输入到pastevia 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

相关内容