从命令“paste”的输出创建表头

从命令“paste”的输出创建表头

我的文件夹(数据)包含大量文本文件。每个文本文件包含一列数字,该列包含 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

或者使用ksh93zsh或者bash假设文件确实有扩展名或者其路径组件中没有目录包含点:

paste_with_header() (
  IFS=$'\t'
  printf '%s\n' "${@%.*}"
  paste -- "$@"
)

${@%.*}.*删除与每个位置参数末尾匹配的最短尾随部分(foo.txt变为foo,但要注意它./foo变为空字符串)。

(这些显然假设文件名不包含表格或换行符)。

相关内容