여러 파일의 열을 병합하고 헤더를 추가합니다.

여러 파일의 열을 병합하고 헤더를 추가합니다.

다음 형식의 파일이 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에서 출력을 열면 다음과 같은 문제가 발생합니다.

  • 제목은 두 줄에 두 번 할당됩니다.
  • 첫 번째와 두 번째 파일의 열이 두 번 추가된 다음 마지막에 파일이 다시 추가됩니다.
  • 모든 값과 제목은 공백으로 구분되며 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

파이썬을 사용해 볼 수 있습니다

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

관련 정보