Loop através do array

1

Eu tenho registros em list.txt (INPUT) como

List of animals SET 1=Dog 2=Crow 3=Snake Pet,bird,reptile
List of Countries SET 1=France 2=Singapore 3=Columbia Europe,Asia,SouthAmerica
List of Parts SET 1=KeyBoard 2=Speaker 3=LEDpanel Computer,AudioPlayer,Television
List of Cities SET 1=Amsterdam 2=KualLumpur 3=Paris Netherlands,Malaysia,France

Deseja que a última coluna de cada linha seja usada como array para substituir os números 1,2,3 Por exemplo. Use Pet,bird,reptile da primeira linha para fazer Pet=Dog bird=Crow e reptile=Snake .

Então, o arquivo OUTPUT seria

List of animals SET Pet=Dog bird=Crow reptile=Snake
List of Countries SET Europe=France Asia=Singapore SouthAmerica=Columbia
List of Parts SET Computer=KeyBoard AudioPlayer=Speaker Television=LEDpanel
List of Cities SET Netherlands=Amsterdam Malaysia=KualLumpur France=Paris

Usando awk , eu poderia dividir a última coluna como string de array. Mas incapaz de usar o mesmo para substituir os números 1,2,3.

    
por Rajan 03.09.2014 / 12:52

4 respostas

1

Você pode executar um loop sobre itens em uma matriz awk a usando a sintaxe for (i in a) . Então, por exemplo, você poderia fazer algo como

awk '{split($NF,a,","); $NF=""; for (i in a) sub(i"=",a[i]"=",$0); print}' list.txt
    
por 03.09.2014 / 13:19
0

Se houver sempre 3 itens ( x=y ) e nenhum espaço nas linhas, essa instrução awk deve funcionar:

awk -F',| |=' '{printf "%s %s %s %s %s=%s %s=%s %s=%s\n", \
$1, $2, $3, $4, $11, $6, $12, $8, $13, $10}' list.txt

Explicação:

  • -F',| |=' : defina o separador de campos para , , espaço e =
  • '{printf ... imprime os valores no formato desejado
  • list.txt do arquivo de entrada
por 03.09.2014 / 13:10
0

Esse script deve funcionar para qualquer número de itens seguidos.

while read line do valType=($(echo $line | awk '{ print $NF }' | tr ',' ' ')) vals=($(echo $line | awk '{ $NF="";$1="";$2="";$3="";$4=""; print $0 }' | tr [1234567890] ' ' | tr '=' ' ' )) echo $line | awk '{print $1" "$2" "$3" "$4 }' | tr -d '\n' numVals=${#vals[@]} for i in $(seq 0 $((numVals-1))) do echo -n " "${valType[$i]}"="${vals[$i]} done echo " " done < list.txt

Explicação:

valType contém uma matriz dos elementos separados por vírgula.

vals contém os valores associados entre a 4ª e a última posições na linha, com números e sinais de igual removidos.

Fazendo um loop pelo número de valores nas matrizes, os valores correspondentes em ambas as matrizes podem ser referenciados.

    
por 03.09.2014 / 13:29
0
set '.\(=.[^ ]*\) ' '\([^,]*\),'
sed "s/\$/,/;s/$1$1$1$2$2$2/  /
" <<\DATA
List of animals SET 1=Dog 2=Crow 3=Snake Pet,bird,reptile
List of Countries SET 1=France 2=Singapore 3=Columbia Europe,Asia,SouthAmerica
List of Parts SET 1=KeyBoard 2=Speaker 3=LEDpanel Computer,AudioPlayer,Television
List of Cities SET 1=Amsterdam 2=KualLumpur 3=Paris Netherlands,Malaysia,France
DATA

Isso usa a matriz de shell para definir sua matriz.

OUTPUT

List of animals SET Pet=Dog bird=Crow reptile=Snake
List of Countries SET Europe=France Asia=Singapore SouthAmerica=Columbia
List of Parts SET Computer=KeyBoard AudioPlayer=Speaker Television=LEDpanel
List of Cities SET Netherlands=Amsterdam Malaysia=KualLumpur France=Paris
    
por 03.09.2014 / 13:45