并排粘贴文件

pasting file side by side

我在一个目录中有很多ascii个文件,我只想按数字对文件名进行排序,然后并排粘贴。 其次,粘贴后我想通过在末尾附加零来使所有列的长度相同。

我的文件被命名为

 data_Z_1   data_N_457 data_E_45
  1.5          1.2       2.3
  2.0          2.3       1.8
               4.5

起初我只想按下面给出的数字对上述文件名进行排序,然后并排粘贴为

data_Z_1  data_E_45 data_N_457
  1.5       2.3      1.2
  2.0       1.8      2.3
                     4.5

其次,我需要在粘贴的文件中使所有列的长度相等,这样输出应该像

   1.5    2.3    1.2
   2.0    1.8    2.3
   0.0    0.0    4.5

I tried as below:
ls data_*_* | sort -V 

但是work.Can没有人帮我提前克服这个问题problem.Thanks。

请您尝试以下操作:

paste $(ls data* | sort -t_ -k3n) | awk -F'\t' -v OFS='\t' '
{for (i=1; i<=NF; i++) if ($i == "") $i = "0.0"} 1'

输出:

1.5     2.3     1.2
2.0     1.8     2.3
0.0     0.0     4.5
  • sort -t_ -k3n 将字段分隔符设置为 _ 并按数字排序 第三个字段值上的文件名。
  • 将选项-F'\t' -v OFS='\t'分配给awk命令 input/output 字段分隔符为制表符。
  • awk 语句for (i=1; i<=NF; i++) if ($i == "") $i = "0.0" 扫描输入字段并为空字段设置 0.0
  • 最后的1等同于print [=19=]打印字段。

[编辑]
如果你有大量的文件,它可能会超过 bash 的能力。这是 python 使用 dataframe.

的替代方案
#!/usr/bin/python

import glob
import pandas as pd
import re

files = glob.glob('data*')
files.sort(key=lambda x: int(re.sub(r'.*_', '', x)))    # sort filenames numerically by its number

dfs = []                                                # list of dataframes
for f in files:
    df = pd.read_csv(f, header=None, names=[f])         # read file and assign column
    df = df.apply(pd.to_numeric, errors='coerce')       # force the cell values to floats
    dfs.append(df)                                      # add as a new column
df = pd.concat(dfs, axis=1, join='outer')               # create a dataframe from the list of dataframes
df = df.fillna(0)                                       # fill empty cells
print(df.to_string(index=False, header=False))          # print the dataframe removing index and header

这将产生相同的结果。