Tenho um arquivo com registros (linhas) tendo dois tipos de delimitadores de campo |
e !
conforme abaixo:
Name|Age|Physics|Chemistry|Maths|English|Batch!Year!AdmisnNo!Grade!Score
Student1|81|65|70|80|88|EWS!2021!1001!A!75
Student2|72|63|60|50|75|EWS!2021!1002!A!85
Student3|72|63|60|50|75|EWS!2021!1002!A!85
Como mesclar Batch
e campos conforme indicado abaixo Year
?AdmisnNo
Observe que, por brevidade, mostrei uma pequena lista de campos úteis, onde meus arquivos reais têm muitos desses campos relacionados. Este campo onde quero remover duas ou três !
marcas não é o último e pode ser qualquer campo (6 ou 7 ) de um total de campos em torno de 49.
Name|Age|Physics|Chemistry|Maths|English|BatchYearAdmisnNo!Grade!Score
Student1|81|65|70|80|88|EWS20211001!A!75
Student2|72|63|60|50|75|EWS20211002!A!85
Student3|72|63|60|50|75|EWS20211002!A!85
Eu solicitei awk
, no entanto, qualquer comando razoavelmente padrão é bem-vindo.
Isso é usado
awk
para excluir os dois primeiros!
caracteres do último|
campo delimitado da entrada.Use qualquer número no lugar de
NF
noawk
código para afetar algum outro campo que não o último campo.Supondo que apenas o último campo contenha
!
caracteres, usandosed
:Isso remove o primeiro
!
em cada linha. Em seguida, ele executa exatamente a mesma substituição uma segunda vez, removendo a segunda!
também.Invertendo cada linha e removendo a 3ª
!
duas vezes seguidas, invertendo a linha resultante novamente. Isso permite que outros|
campos delimitados também contenham!
caracteres.Essa tarefa é boa para
sed
, sem dividir os campos, mesclar o 7º campo com o próximo:Correr mais uma vez mesclará o 7º (inicialmente o 8º) com o próximo. Totalmente:
Ou mais brevemente (sugerido por Philippos), pois a segunda substituição acontecerá se a primeira acontecer:
Também
-E
é usado para portabilidade, ou seja, para expressões regulares estendidas.Resultado:
Observe que após a primeira substituição, o 8º campo se tornou o 7º, então usamos
7
novamente para ele. É o mesmo que fazersed '' file | sed ''
.Também é conveniente sobre os diferentes separadores de campo que você tem aqui e pode ser ajustado para mesclar quase todos os campos vizinhos.
Usando GNU awk para o 4º argumento para
split()
:Trabalhou para o exemplo acima e obteve a saída desejada
resultado
Aqui está apenas uma solução perl possível
escrito com uma série de
join
s para que, se o seu caso de uso ficar mais complicado, digamos que você queira descartar a matemática, basta descartar esse índice (4)Parecia mais limpo do que concatenar campos e emendar os campos extras da matriz antes de juntar novamente.