A saída variável não concatena

3

Eu tenho um script que concatena a saída de duas variáveis diferentes. O problema é que a saída de ambas as variáveis contém várias linhas. Então, a saída não é o que eu espero.

Primeira variável e saída:

snap_daily='cat snaps.txt | grep test-for-dr | awk '{print $2}' | sed 's/[",]//g' | sed 's/test-for-dr-//g''

2017-03-10-08-00
2017-03-10-11-00
2017-03-10-12-00
2017-03-10-14-00
2017-03-10-15-00

Segunda variável e saída:

snap_prefix='cat snaps.txt | grep test-for-dr | awk '{print $2}' | sed 's/[",]//g' | awk -F '2017' '{print $1}'

test-for-dr-
test-for-dr-
test-for-dr-
test-for-dr-
test-for-dr-

Codifique para concatenar e resultar:

 snap_name="$snap_prefix$snap_daily"

 test-for-dr-bdmprest- test-for-dr-bdmprest- test-for-dr-bdmprest- test-for-dr-bdmprest- test-for-dr-bdmprest-2017-03-10-08-00 2017-03-10-11-00 2017-03-10-12-00 2017-03-10-14-00 2017-03-10-15-00

Resultado desejado:

test-for-dr-2017-03-10-08-00
test-for-dr-2017-03-10-11-00
test-for-dr-2017-03-10-12-00
test-for-dr-2017-03-10-14-00
test-for-dr-2017-03-10-15-00

Essencialmente, eu preciso de cada linha para combinar de cada linha de saída.

    
por N.M.D 12.03.2017 / 02:02

4 respostas

1

Quando você tem duas variáveis de várias linhas, há algumas maneiras de combiná-las:

  1. declare as vars para testes

    $ snap_prefix="test-for-dr-
    test-for-dr-
    test-for-dr-
    test-for-dr-
    test-for-dr-"
    $ snap_daily="2017-03-10-08-00
    2017-03-10-11-00
    2017-03-10-12-00
    2017-03-10-14-00
    2017-03-10-15-00"
    
  2. use um loop bash para ler uma linha de cada variável:

    while read -u3 prefix; read -u4 suffix; do 
        echo "$prefix$suffix"
    done 3<<<"$snap_prefix" 4<<<"$snap_daily"
    
  3. use pr para converter um único fluxo em 2 colunas (e, em seguida, tr para remover o caractere de tabulação que separa as colunas)

    { echo "$snap_prefix"; echo "$snap_daily"; } | pr -2Ts | tr -d '\t'
    

2 e 3 ambas as saídas:

test-for-dr-2017-03-10-08-00
test-for-dr-2017-03-10-11-00
test-for-dr-2017-03-10-12-00
test-for-dr-2017-03-10-14-00
test-for-dr-2017-03-10-15-00

MAS , aposto que isso funcionaria com a entrada que você não nos mostrou:

grep -Eo 'test-for-dr-[[:digit:]-]+' snaps.txt
    
por 14.03.2017 / 15:24
1

Se a meta final é reorganizar e imprimir o campo 2 do arquivo snaps.txt , não há necessidade de variáveis intermediárias nem uma necessidade de grep-sed-awk pipelines, uma única invocação de awk deve ser capaz de fazer o trabalho

awk '$2 ~ /test-for-dr-/{
     gsub(/[",]/, "", $2)
     match($2, "test-for-dr-")
     printf "%s%s\n", substr($2, RSTART), substr($2, 1, RSTART-1)
     }' snaps.txt
    
por 12.03.2017 / 04:40
0

Uma solução fácil é usar matrizes, pois os resultados são retornados com novas linhas:

$ IFS=$'\n' readarray -t a< <(echo $'2017-03-10-08-00\n2017-03-10-11-00\n2017-03-10-12-00\n2017-03-10-14-00\n2017-03-10-15-00\n')

$ IFS=$'\n' readarray -t b < <(echo $'test-for-dr-\ntest-for-dr-\ntest-for-dr-\ntest-for-dr-\ntest-for-dr-\n')

$ declare -p a b
declare -a a=([0]="2017-03-10-08-00" [1]="2017-03-10-11-00" [2]="2017-03-10-12-00" [3]="2017-03-10-14-00" [4]="2017-03-10-15-00" [5]="")
declare -a b=([0]="test-for-dr-" [1]="test-for-dr-" [2]="test-for-dr-" [3]="test-for-dr-" [4]="test-for-dr-" [5]="")

$ for ((i=0;i<"${#a[@]}";i++));do conc="${b[$i]}${a[$i]}";echo "$conc";done
test-for-dr-2017-03-10-08-00
test-for-dr-2017-03-10-11-00
test-for-dr-2017-03-10-12-00
test-for-dr-2017-03-10-14-00
test-for-dr-2017-03-10-15-00

Outra solução seria usar apenas um script awk para combinar os resultados de todos os arquivos, mas precisamos de mais detalhes para isso - talvez uma nova pergunta.

    
por 12.03.2017 / 03:14
0

Espero que isso ajude você ::

#!/bin/bash

cat snaps.txt | grep test-for-dr | awk '{print $2}' | sed 's/[",]//g' | sed 's/test-for-dr-//g' > snap_daily.txt
cat snaps.txt | grep test-for-dr | awk '{print $2}' | sed 's/[",]//g' | awk -F '2017' '{print $1}' > snap_prefix.txt

a='cat snap_daily.txt | wc -l'
let x=1
for i in 'cat snap_daily.txt'
do
snap_daily='cat snap_daily.txt | sed -n "$x"p'
snap_prefix='cat snap_prefix.txt | sed -n "$x"p'
if [[ $x -eq $a ]]
then exit 0
fi
echo $snap_daily$snap_prefix
let x++
done

Obrigado!

    
por 12.03.2017 / 03:19