Como posso adicionar um caractere ao início de cada coluna que começa com um número:
Exemplo adicionando um c
a:
4 r4 8 8 4
Então eu recebo esta saída:
c4 r4 c8 c8 c4
Deve funcionar para um número variável de colunas.
Como posso adicionar um caractere ao início de cada coluna que começa com um número:
Exemplo adicionando um c
a:
4 r4 8 8 4
Então eu recebo esta saída:
c4 r4 c8 c8 c4
Deve funcionar para um número variável de colunas.
Você pode usar sed para modificar todas as colunas de uma vez:
Se o seu separador de campos for diferente de um espaço, substitua o espaço
(^| )
nesta parte da expressão regular pelo seu separador de campos.-E
especifique para usar Expressão Regular Estendida (ERE) em vez de Expressão Regular Básica (BRE)s
:s/regexp/replacement/
(^| )
corresponder ao início de uma linha ou espaço em um grupo de captura([[:digit:]])
corresponder a um dígito em um grupo de captura\1c\2
o conteúdo do primeiro grupo de captura (\1
), o caracterec
, o conteúdo do segundo grupo de captura (\2
)g
globalmenteUma vez que o resultado o satisfaça e se sua
sed
implementação o suportar, você poderá adicionar-i
(-i ''
no FreeBSD ou derivados como macos) para modificar o arquivo no local. (-i.bak
se você quiser fazer um backup do seu arquivo original)Eu usaria um
awk
-oneliner assim:echo '4 r4 8 8 4' | awk '{ for (i=1; i<=NF; i++) if ($i ~ /^[0-9]/) $i = "c" $i }1'
Espero que tenha ajudado :)
Uma maneira seria usar uma expressão regular para testar se cada campo começa com um número:
saída:
Usando
gawk
:Usando Raku (anteriormente conhecido como Perl_6)
Aqui estão as respostas codificadas em Raku, um membro da família Perl de linguagens de programação. Acima, o arquivo é lido com os
-pe
sinalizadores de impressão automática linear. A substituição será:g
global e diz: " Se for encontrado o início da linha^
ou espaço em branco seguido de um dígito, substitua."\s+
\d
No primeiro exemplo, a correspondência após o espaço em branco é eliminada usando os
<(…)>
marcadores de captura de Raku. O$/
match-object resultante é exibido na substituição, seguido pela letrac
. No segundo exemplo, a correspondência inteira está contida em duas capturas ($0
e$1
) e é gerada na substituição como$0c$1
.Entrada de amostra:
Saída de amostra:
Alternativamente (e muito mais explicitamente), abaixo irá "regularizar" os espaços em branco entre as colunas:
Primeiro, a linha de entrada está
.split
no espaço em branco da variável (\s+
), então cada coluna émap
inserida parasubst
ituar quaisquer colunas^
começando com a\d
, adicionando ac
antes da correspondência (aqui usando$/
match-object ou$0
).//
Se a correspondência for indefinida (usando o operador "OR definido" do Raku ), não insira""
nada. As colunas são retornadas com um único espaço em branco entre elas.https://docs.raku.org/language/regexes#Regexes
https://raku.org
Usando Miller (
mlr
) para aplicar uma função que precede o caracterec
ao valor de um campo, se for um número:Isso usa Miller para ler os dados como um conjunto de dados formatado em caixa de ferramentas Unix (registros delimitados por nova linha com campos delimitados por espaço) e aplica uma
put
expressão a cada registro.A
put
expressão usaapply()
para aplicar uma função anônima a cada campo. A função testa o valor do campo e, se for numérico, precede o valor comc
, caso contrário, o deixa inalterado.O
is_numeric()
teste é verdadeiro para números , não apenas para dígitos. Isto é o que a pergunta pede especificamente:Você gostaria de testar um dígito inicial , basta substituir o
is_numeric()
teste por um teste para um dígito inicial: