Bash 脚本:如何将文件名作为标题导出到 csv

Bash 脚本:如何将文件名作为标题导出到 csv

我的文件夹“Subj1”中有多个 .txt 文件,按以下格式排列

  regional_vol_GM_atlas1.txt
  regional_vol_GM_atlas1_prop.txt
  ....
  regional_vol_GM_atlas152.txt

每个文件由以下格式的数据组成

667869 667869
580083 580083
316133 316133
11398.1 11398.1

我想将文本文件中的数据以及关联的文件名导出到 csv 文件。

我已经为此编写了代码

#!/bin/bash

for x in regional_vol*.txt; do

   /bin/echo -n -e "$x\t"

done

paste regional_vol*.txt >> final_table.csv

它将每个文件中的数据粘贴到 csv 文件中,示例输出图像如下所示,

输出图像

但在输出中我想获取关联的文件名作为数据的标题我如何更改我的代码以获得这样的输出?

这是我期望的输出示例

样本输出

答案1

我认为您想要的是一个简单的echo命令重定向,并且很可能是另一个echo打印换行符。像这样的东西:

files="regional_vol*.txt"
dst=final_table.csv
# remove the hash sign here to truncate the destination before writing
# > $dst    
for x in $files; do
   /bin/echo -n -e "$x\t" >> $dst
done
echo >> $dst
paste $files >> $dst

或用printf代替循环:

printf "%s\t" $files >> $dst
echo >> $dst
paste $files >> $dst

这两个都会在标题行末尾打印一个额外的选项卡,但这应该不重要。

答案2

一个简单但不优雅的解决方案是在每个文件的第一行添加文件名:

for x in $(ls regional_vol*.txt | sort -n); do
   echo ${x} > tmp-${x}
   cat ${x} >> tmp-${x}
done

paste tmp-regional_vol*.txt > final_table.csv
rm tmp-regional_vol*.txt

答案3

(我假设您已经旋转了文件,因为每个文件都是图片中的一列。

在您的脚本中,每个文件都作为行添加到 CSV 中。 CSV 中的每一行都应是电子表格中的一行。

使用 SED 和 AWK 操作文件内容并构建字符串“filename,field1,field2,field3,...”。回显该字符串以附加到您的 CSV。

然后,当您打开图中的电子表格时,执行与在该电子表格上执行的相同旋转操作。或者保持通常的“每行都是一个条目”格式。实际上这是推荐的,因为文件名应该是一个字段,而不是标题。换句话说,标题名称为 filename 的字段应包含 CSV 中每个条目的文件名。

相关内容