【问题标题】:pasting file side by side并排粘贴文件
【发布时间】:2021-12-19 16:45:28
【问题描述】:

我在一个目录中有很多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 

但它不起作用。任何人都可以帮助我克服这个问题。在此先感谢。

【问题讨论】:

    标签: python-3.x bash numpy for-loop awk


    【解决方案1】:

    请您尝试以下方法:

    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 将字段分隔符设置为 _ 并按数字排序 第三个字段值的文件名。
    • awk 命令分配的选项-F'\t' -v OFS='\t' 制表符的输入/输出字段分隔符。
    • awk 语句for (i=1; i&lt;=NF; i++) if ($i == "") $i = "0.0" 扫描输入字段并为空字段设置0.0
    • 最后的1 相当于print $0 打印字段。

    [编辑]
    如果你有大量的文件,它可能会超出 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
    

    这将产生相同的结果。

    【讨论】:

    • 如果我的文件很少,它可以工作,但如果我有近 5000 个数据文件,它会显示粘贴:data_N_1021:打开的文件太多
    • 5000 of data files 是一个新的、令人不快的信息,在原始帖子中没有注意到。我想它通常超出了 bash 和相关命令的能力。你更喜欢python解决方案吗?如果是这样,请先发布您自己的python代码。
    • 是的,如果可能请提供python解决方案
    • 我想让你展示你用 python first 尝试过的东西。一段代码就够了。
    • 我已经用python 版本更新了我的答案。使用 10,000 个数据文件进行测试。
    猜你喜欢
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2017-09-21
    相关资源
    最近更新 更多