并排粘贴文件
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
这将产生相同的结果。
我在一个目录中有很多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
这将产生相同的结果。