키 열을 기반으로 파일 행 병합

키 열을 기반으로 파일 행 병합

~ 구분 기호 값이 포함된 텍스트 파일이 있습니다. 처음 4개 열은 키 열이므로 5번째 열의 값을 기준으로 추출해야 합니다. 파일은 다음과 같습니다.

S1~D1~1~1~abc
S1~D1~1~1~bef
S2~D1~1~2~xyz
S2~D1~1~2~mnp

출력은 다음과 같아야합니다

S1~D1~1~1~abcbef
S2~D1~1~2~xyzmnp

마지막 열에는 개행 문자가 있는 경우가 있는데, 두 행을 올바르게 병합하려면 제거해야 합니다.

답변1

awk '
  BEGIN{OFS = FS = "~"} 
  {x = $5; NF--; a[$0] = a[$0] x; next} 
  END{for(i in a) print i, a[i]}
' file
S1~D1~1~1~abcbef
S2~D1~1~2~xyzmnp

답변2

Pandas에서 Python을 사용할 수 있는 경우:

#!/usr/bin/python3
# combine_by_keys.py
# Take input file with tilde-delimited keys and combine strings with exact key
# match.
#
# ./combine.py myfile.txt
#
import pandas as pd
import re
import sys

filename = sys.argv[1]

# Read keys and strings into lists.
keys = list()                
strings = list()             
with open(filename) as f:
    for line in f.readlines():
        key, string = line.strip().rsplit('~', 1)
        keys.append(key)
        strings.append(string)

print(re.sub(
        r'\ +',  # Pandas separates index and values with spaces.
        '~',     # Replace spaces with tilde.
        pd.DataFrame({'keys':keys,'strings':strings})
                .groupby('keys')['strings']
                .apply(lambda x:''.join(x))
                .to_string(header=False)))

이와 같은 데이터 파일에 사용하세요.

$ cat myfile.txt 
S1~D1~1~1~abc
S1~D1~1~1~bef
S2~D1~1~2~xyz
S2~D1~1~2~mnp

$ ./combine_by_keys.py myfile.txt 
S1~D1~1~1~abcbef
S2~D1~1~2~xyzmnp

관련 정보