我的文件夹(数据)包含大量文本文件。每个文本文件包含一列数字,该列包含 30 个数字。我想创建组合这些文本文件中的列的表。我使用了以下命令:
cd data
paste *.txt > all_data.txt
输出如下:
0.834679 0.612341 0.510057 0.580128 .....
1.837894 1.061547 0.961449 1.343096 .....
1.638215 1.024628 1.113596 1.80506 .....
1.596119 0.971842 1.14204 1.73881 .....
1.568142 1.025716 1.217219 1.769668 .....
1.554016 0.977165 1.226769 1.786335 .....
1.543137 1.001812 1.247598 1.840443 .....
1.491823 0.99437 1.28337 1.784271 .....
1.371208 0.931998 1.259749 1.717408 .....
1.390867 0.905996 1.300722 1.739213 .....
1.35813 0.283377 1.307122 1.733058 .....
......
该命令将所有列合并到一个大电子表格中。我的问题:有没有办法将每一列粘贴到文本文件中,并将文本文件名标题添加到该列。如下:
text_file1 text_file2 text_file3 text_file4 ....
0.834679 0.612341 0.510057 0.580128 .....
1.837894 1.061547 0.961449 1.343096 .....
1.638215 1.024628 1.113596 1.80506 .....
1.596119 0.971842 1.14204 1.73881 .....
1.568142 1.025716 1.217219 1.769668 .....
1.554016 0.977165 1.226769 1.786335 .....
1.543137 1.001812 1.247598 1.840443 .....
1.491823 0.99437 1.28337 1.784271 .....
1.371208 0.931998 1.259749 1.717408 .....
1.390867 0.905996 1.300722 1.739213 .....
1.35813 0.283377 1.307122 1.733058 .....
......
答案1
你可以做:
paste_with_header() (
IFS=$(printf '\t') # or IFS=$'\t' with some shells
printf '%s\n' "$*"
paste -- "$@"
)
paste_with_header text_file* > all_data.txt
"$*"
扩展为与 的第一个字符连接的位置参数(函数的参数)列表$IFS
,我们将其设置为TAB
,该字符paste
也用于连接文件的行。
要删除标头中的文件扩展名,请使用zsh
:
paste_with_header() (
printf '%s\n' ${(pj:\t:)@:r}
paste -- "$@"
)
${@:r}
扩展为每个位置参数的根名称(删除扩展名)。j:\t:
要加入的参数扩展标志\t
。这p
被\t
解释为TAB
或者使用ksh93
,zsh
或者bash
假设文件确实有扩展名或者其路径组件中没有目录包含点:
paste_with_header() (
IFS=$'\t'
printf '%s\n' "${@%.*}"
paste -- "$@"
)
${@%.*}
.*
删除与每个位置参数末尾匹配的最短尾随部分(foo.txt
变为foo
,但要注意它./foo
变为空字符串)。
(这些显然假设文件名不包含表格或换行符)。