我有 50 多个具有以下格式的文件:
文件1.tab
A 25
B 56
C 87
D 82
E 91
F 34
文件2.tab
A 89
B 55
C 92
D 36
E 28
F 19
文件3.tab
A 98
B 76
C 82
D 76
E 49
F 42
ETC。
我想要以下内容:
- 这些列基于第一列合并在一起。
- 每列都有文件名作为标题。
- 值由制表符而不是空格分隔,因此当我在 Excel 中打开合并文件时,它将有多列(即,column1=“row1 为空,row2 为 A 等”;column2=“row1 是 File1.tab,row2 是25 等”;column3=“row1 是 File2.tab,row2 是 89 等等”;等等)。
最终选项卡
File1.tab File2.tab File3.tab
A 25 89 98
B 56 55 76
C 87 92 82
D 82 36 76
E 91 28 49
F 34 19 42
我尝试寻找答案并遵循以下命令:来自按第一列合并多个文件
带标题打印:对于多文件版本:
$ hdr() { awk 'FNR==1{ print "\0", FILENAME }1' "$1"; }
$ join -a1 -a2 -e 1 -o auto <(hdr file1) <(hdr file2) >join.tmp
$ for file in rest_files*; do
join -a1 -a2 -e 1 -o auto join.tmp <(hdr "$file") >join.tmp.1
mv join.tmp.1 join.tmp
done
$ tr -d '\0' <join.tmp >final.file
当我在excel中打开输出时,我遇到了以下问题:
- 标题在两行中分配了两次
- 第一个和第二个文件中的列被添加两次,然后在最后再次添加文件。
- 所有值和标题均以空格分隔,并仅分配给 Excel 中的一列。
它看起来是这样的:
最终选项卡
File1.tab File2.tab File3.tab join.temp
File1.tab File2.tab File3.tab File1.tab
A 25 89 25 89 98 25
B 56 55 56 55 76 56
C 87 92 87 92 82 87
D 82 36 82 36 76 82
E 91 28 91 28 49 91
F 34 19 34 19 42 34
您能否修复当前的代码或为我提供我需要的新代码?
答案1
我提供了完整的 awk 解决方案(因为您正在使用 awk)。
BEGIN {
fname=""
f=0
}
NR == FNR {
col[NR]=$1
colmax=NR
}
{ if ( FILENAME != fname ) {
f++
fname=FILENAME
colfname[f]=fname
}
col2[FNR "-" f]=$2
}
END {
for ( j=1 ; j<= f; j++ ) printf "\t%s",colfname[j]
printf "\n"
for ( i=1 ; i<=colmax ; i++ ) {
printf "%s",col[i]
for ( j=1 ; j<= f; j++ ) printf "\t%s",col2[i "-" j]
printf "\n"
}
}
被称为
awk -f merge.awk f?.tab
给出
f1.tab f2.tab f3.tab
A 25 89 98
B 56 55 76
C 87 92 82
D 82 36 76
E 91 28 49
F 34 19 42
初始化变量
BEGIN {
fname=""
f=0
}
在第一个文件上,收集第一个列名称
NR == FNR {
col[NR]=$1
colmax=NR
}
当 FILENAME 改变时,收集它(之后),并记住它
{ if ( FILENAME != fname ) {
f++
fname=FILENAME
colfname[f]=fname
}
收集第二列的值
col2[FNR "-" f]=$2
}
END {
转储文件名
for ( j=1 ; j<= f; j++ ) printf "\t%s",colfname[j]
printf "\n"
转储值
for ( i=1 ; i<=colmax ; i++ ) {
printf "%s",col[i]
for ( j=1 ; j<= f; j++ ) printf "\t%s",col2[i "-" j]
printf "\n"
}
}
答案2
你可以尝试使用python
file_list = ['File1.tab', 'File2.tab', 'File3.tab']
df = pd.DataFrame()
for file in file_list:
temp_df = pd.read_csv(file, header=None, names=[file[:-4]])
df = pd.concat([df, temp_df], axis=1)
print(df)
File1 File2 File3
A 25 89 98
B 56 55 76
C 87 92 82
D 82 36 76
E 91 28 49
F 34 19 42