Bash classificando várias cadeias duplicadas em um arquivo -- bash campo com sed camp askubuntu Relacionado O problema

bash sorting multiple duplicate strings in a file


1
vote

problema

português

Eu tenho arquivo como abaixo:

  Personname:Mark Hobby:chess Hobby:tennis Personname:Tom Hobby:swimming Hobby:badminton Hobby:boxing Hobby:music Personname:Nick Hobby:swimming Personname:fabio Hobby:swimming Hobby:badminton Hobby:boxing Hobby:music    

O que eu preciso está abaixo do formato:

  Mark,chess,tennis Tom,swimming,badminton,badminton,boxing,music Nick,swimming fabio,swimming,badminton,badminton,boxing,music    

Eu tentei com "TR", enquanto, mas não conseguir descobrir a lógica correta por causa de nomes de string duplicados. Você pode consultar?

english

I have file like below:

Personname:Mark Hobby:chess Hobby:tennis Personname:Tom Hobby:swimming Hobby:badminton Hobby:boxing Hobby:music Personname:Nick Hobby:swimming Personname:fabio Hobby:swimming Hobby:badminton Hobby:boxing Hobby:music 

What I need is below format:

Mark,chess,tennis Tom,swimming,badminton,badminton,boxing,music Nick,swimming fabio,swimming,badminton,badminton,boxing,music 

I tried with "tr", while but not able to figure out the correct logic because of duplicate string names. Can you advice?

     

Lista de respostas

3
 
vote

Fazendo o mesmo que o OLI sugeriu com sh em vez de awk:

  [Desktop Entry] Version=1.0 Encoding=UTF-8 Hidden=false Icon=my/icon/path                           <-- optional (for the file icon) Type=MimeType Patterns=*.xxx                              <--- my file extention  MimeType=application/myAppName              <--- the mimetype of the file Comment=My Comment 3   
 

Doing the same as Oli suggested with sh instead of awk:

#!/bin/sh  IFS=: while read key value; do     if [ "$key" = "Personname" ]; then         printf "\n%s" $value     else         printf ",%s" $value     fi done < data 
 
 
1
 
vote

Você pode fazer isso com bastante trivialmente com um [Desktop Entry] Version=1.0 Encoding=UTF-8 Hidden=false Icon=my/icon/path <-- optional (for the file icon) Type=MimeType Patterns=*.xxx <--- my file extention MimeType=application/myAppName <--- the mimetype of the file Comment=My Comment 4 . Isso só olha para cada linha por conta própria. Se for um nome, nós colocamos uma nova linha e imprimi o nome, se não for, nós colocamos uma vírgula em (sem uma nova linha) e imprimir o hobby.

  [Desktop Entry] Version=1.0 Encoding=UTF-8 Hidden=false Icon=my/icon/path                           <-- optional (for the file icon) Type=MimeType Patterns=*.xxx                              <--- my file extention  MimeType=application/myAppName              <--- the mimetype of the file Comment=My Comment 5   

A sugestão de αғsнιη nos comentários muda a lógica ao redor para usar uma condição ternária para decidir qual seqüência para escrever. É legal, mas eu verificaria explicitamente que estávamos olhando para uma pessoa ou uma linha de hobby e não um espaço em branco ou não um hobby chamado PersonName. Algo como isso deve fazer isso:

  [Desktop Entry] Version=1.0 Encoding=UTF-8 Hidden=false Icon=my/icon/path                           <-- optional (for the file icon) Type=MimeType Patterns=*.xxx                              <--- my file extention  MimeType=application/myAppName              <--- the mimetype of the file Comment=My Comment 6   
 

You can do this fairly trivially with an awk. This just looks at each line on its own. If it's a name, we stick a newline in and print the name, if it's not, we stick a comma in (without a newline) and print the hobby.

$ awk -F: '$1=="Personname" {printf("\n%s", $2)} $1=="Hobby" {printf(",%s", $2)}' data   Mark,chess,tennis Tom,swimming,badminton,boxing,music Nick,swimming fabio,swimming,badminton,boxing,music 

xcexb1xd2x93sxd0xbdxcexb9xcexb7's suggestion in the comments switches the logic around to use a ternary condition to decide what string to write. It's neat but I'd explicitly check we were looking at a Personname or Hobby line and not a blank one or not a Hobby called Personname. Something like this should do it:

awk -F: '{printf $1=="Personname" ? "\n"$2 : $1=="Hobby" ? ","$2 : ""}' data 
 
 
     
     

Perguntas relacionadas

2  Como executar programaticamente novas linhas vazias de um arquivo?  ( How to programatically remove empty new lines from a file ) 
Eu preciso remover novas linhas vazias do arquivo de texto no terminal. arquivo de exemplo 123 123 123 123 123 123 Eu procurei no Google um pouco...

4  Como encontrar texto e substituir essa linha Se existir com o terminal de outra forma apenas anexar linha para finalizar  ( How to find text and replace that line if exists with terminal otherwise just ap ) 
Eu quero colocar em sudo gedit /etc/sysctl.conf a única linha vm.swappiness=10 que às vezes altero. Por padrão, esta linha não existe, então eu uso ech...

1  SED / AWK - Remova todas as tags, exceto apenas duas tags e textos simples  ( Sed awk remove all tags except only two tags and plain texts ) 
Aqui está uma amostra para o meu arquivo de texto: <w:r><w:t> <w:r w:rsidR="00D171FD"> <w:t></w:t> </w:r><w:r> <w:t xml:space="preserve"> This is a sample ...

0  Como usar o comando sed para procurar string com caractere "/" nele e substitua por alguma outra string?  ( How to use of sed command to search string with character in it and replace ) 
Eu executo o comando: sed 's/http:///www/' filename Na saída, este comando não substituiu "http: //" com "www" por quê? e como alterar o delimitador ...

15  Regex com comando sed para analisar texto json  ( Regex with sed command to parse json text ) 
Eu tenho este texto JSON: { "buildStatus" : { "status" : "ERROR", "conditions" : [{ "status" : "OK", "m...

1  Substitua apenas alguns números usando SED [FECHADO]  ( Replace only certain numbers using sed ) 
. fechado . Esta pergunta precisa detalhes ou clareza . Atualmente não está aceitando respostas. ...

1  Usando sed para adicionar caracteres no final de uma linha adiciona uma nova linha  ( Using sed to add characters at the end of a line adds a new line ) 
Eu estou fazendo um script para converter algumas varetas mágicas de um formato para outro. Eu preciso inserir o código SET para cada cartão no final da linha...

7  Como substituir as strings no arquivo sem regex?  ( How to replace strings in file without regex ) 
Eu preciso substituir algumas strings em arquivos (da linha de comando), mas não quero usar sed -i porque minha string contém muitos caracteres engraçados q...

3  Remova tudo antes da primeira ocorrência da palavra especificada  ( Remove everything before first occurence of specified word ) 
Como posso remover tudo antes da primeira ocorrência de uma palavra especificada usando sed ? O que eu tentei até agora: echo $(cat /etc/nginx/sites-ena...

4  Remover citações em torno de números inteiros em um arquivo CSV  ( Remove quotes around integers in a csv file ) 
em um grande arquivo csv (& gt; 1 gb) eu tenho algo como "34432", "name", "0", "very long description" Mas em vez disso gostaria de ter 34432, "name...




© 2022 pergunte.org All Rights Reserved. Casa de perguntas e respostas todos os direitos reservados


Licensed under cc by-sa 3.0 with attribution required.