次の形式のファイルが50以上あります。
ファイル1.タブ
A 25
B 56
C 87
D 82
E 91
F 34
ファイル2.タブ
A 89
B 55
C 92
D 36
E 28
F 19
ファイル3.タブ
A 98
B 76
C 82
D 76
E 49
F 42
など。
私は以下が欲しい:
- 列は、最初の列に基づいて一緒にマージされます。
- 各列にはタイトルとしてファイル名があります。
- 値はスペースの代わりにタブで区切られているため、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で出力を開くと、次の問題が発生します。
- タイトルは2行に2回割り当てられます。
- 最初と2番目のファイルの列が2回追加され、最後にファイルが再び追加されます。
- すべての値とタイトルはスペースで区切られ、Excelでは1つの列にのみ割り当てられます。
次のようになります。
最後のタブ
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
}
2番目の列の値を収集します。
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