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
Eu tenho um arquivo de texto que possui valores de delimitadores ~. As primeiras 4 colunas são as colunas-chave e, com base no valor da quinta coluna, precisam ser extraídas. O arquivo é assim:
S1~D1~1~1~abc
S1~D1~1~1~bef
S2~D1~1~2~xyz
S2~D1~1~2~mnp
a saída deve se parecer com
S1~D1~1~1~abcbef
S2~D1~1~2~xyzmnp
a última coluna tem, por vezes, quebra de linha, que deve ser removida, uma vez que irá fundir duas linhas corretamente.
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
Se você está bem usando Python com Pandas:
#!/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)))
Use-o em um arquivo de dados como este.
$ 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