Recortar e substituir coluna específica de uma lista de arquivos

0
41703
10002
30003
40002
40000
20203
20203
30100
50000
50000
50000
50000
70700
70600

Eu tenho este arquivo. e eu quero saída como

4.17.3
1.0.2
3.0.3
4.0.2
4.0.0
2.2.3
2.2.3
3.1.0
5.0.0
5.0.0
5.0.0
5.0.0
7.7.0
7.6.0

Estou trabalhando na máquina solaris.

    
por Utkarsh Mishra 22.03.2018 / 12:32

3 respostas

3
$ sed -e 's/\(.\)\(..\)\(..\)/../' -e 's/\.0/./g' file
4.17.3
1.0.2
3.0.3
4.0.2
4.0.0
2.2.3
2.2.3
3.1.0
5.0.0
5.0.0
5.0.0
5.0.0
7.7.0
7.6.0

A primeira substituição sed cria x.yy.zz de xyyzz . Ele faz isso capturando os três grupos de caracteres em grupos de captura separados (o \(.\) e os dois \(..\) em que cada ponto corresponde a um único caractere) e os insere novamente com pontos entre eles.

A segunda substituição remove qualquer zero imediatamente após um ponto.

    
por 22.03.2018 / 12:39
4

Awk solução:

awk '{ printf "%d.%d.%d\n", substr($1,1,1), substr($1,2,3)/10, substr($1,5) }' file
  • substr(string, start [, length ]) - Retorna uma substring length -character-long de string , iniciando no número de caractere start .

A saída:

4.17.3
1.0.2
3.0.3
4.0.2
4.0.0
2.2.3
2.2.3
3.1.0
5.0.0
5.0.0
5.0.0
5.0.0
7.7.0
7.6.0

Se o GNU awk for suportado, um caminho mais curto seria o seguinte:

awk -v FS="" '{ print $1, ($2$3$4)/10, $5 }' OFS='.' file
  • FS="" - Se o valor for a cadeia nula ( "" ), cada caractere no registro se tornará um campo separado.
por 22.03.2018 / 12:39
0

solução sed GNU

sed -r 's/\B(..)/../; s/\.0/./g' input.txt

\ B - Correspondências em todos os lugares, exceto em um limite de palavra; ou seja, se o caractere à esquerda e o caracter à direita forem caracteres de "palavra" ou de "não-palavra".

A solução sed sem recursos GNU

sed -r 's/(.)(..)/../; s/\.0/./g' input.txt

Resultado

4.17.3
1.0.2
3.0.3
4.0.2
4.0.0
2.2.3
2.2.3
3.1.0
5.0.0
5.0.0
5.0.0
5.0.0
7.7.0
7.6.0
    
por 22.03.2018 / 17:32

Tags