Adicione texto a cada coluna [duplicado]

3

Eu tenho as seguintes linhas

3, 3, 100
4, 2, 50
8, 5, 80
.
.
.

e eu quero o seguinte resultado

line starts at 3 and ends at 3 with value 100
line starts at 4 and ends at 2 with value 50
line starts at 8 and ends at 5 with value 80
.
.
.

Eu tentei o seguinte: sed 's/^/line starts at /' , em seguida, aplicando este comando para a saída: sed 's/, / and ends at /' , em seguida, aplicando este comando para a saída sed 's/, / with value /' . Existe alguma maneira de fazer isso em uma única linha?

    
por Franky 03.04.2018 / 04:46

4 respostas

12

awk é bom para esse tipo de saída formatada de entrada formatada:

awk -F, '{printf("line starts at %d and ends at %d with value %d\n", $1, $2, $3)}' file 
line starts at 3 and ends at 3 with value 100
line starts at 4 and ends at 2 with value 50
line starts at 8 and ends at 5 with value 80
    
por 03.04.2018 / 05:33
3

Um loop de while read do shell com printf :

while IFS=', ' read c1 c2 c3; do
    printf 'line starts at %s and ends at %s with value %s\n' \
        "$c1" "$c2" "$c3"
done <file

Ao definir a variável IFS para um espaço e uma vírgula, o comando read usará esses caracteres como delimitadores de campo.

Saída:

line starts at 3 and ends at 3 with value 100
line starts at 4 and ends at 2 with value 50
line starts at 8 and ends at 5 with value 80
    
por 03.04.2018 / 12:26
2

Acontece que existe a opção -e no sed

sed -e 's/^/line starts at /g' -e 's/, / and ends at /' -e 's/, / with value at /'
    
por 03.04.2018 / 05:20
0

Existe uma maneira fácil e rápida de fazer isso no próprio shell: -


# cat f
3, 3, 100
4, 2, 50
8, 5, 80

# cat f | while read line ;  do  IFS=", " array=($line) ; echo "line starts at ${array[0]} and ends at ${array[1]} with value ${array[2]}"; done 

line starts at 3 and ends at 3 with value 100
line starts at 4 and ends at 2 with value 50
line starts at 8 and ends at 5 with value 80

    
por 03.04.2018 / 10:28