Extraindo strings de texto do arquivo, atribuindo-as a variáveis e depois gravando-as em outro arquivo?

1
Basicamente, é um servidor de jogo (minecraft) e eu tenho uma situação em que estou tentando automatizar a nova geração do mundo. Basicamente, eu tenho um arquivo que é gerado felizmente com este snippet.

arquivo1.txt

keepSpawnInMemory: 'true'
spawnLocation:
  ==: MVSpawnLocation
  yaw: 0.0
  pitch: 0.0
  z: 256.5
  y: 62.0
  x: -223.5
autoLoad: 'true'
bedRespawn: 'true'

Isso funciona bem, mas eu preciso extrair o z: 256,5, y: 62,0 e x: -223,5, respectivamente, e depois escrever um arquivo chamado file2.txt com as seguintes linhas.

 world: mine
 x: -223.5
 y: 62.0
 z: 256.5
 yaw: 0.0
 pitch: 0.0
 name: mine

Eu assumo que vou usar algo como o awk para extrair os números iniciais, atribuindo-os às variáveis e depois escrevendo o arquivo? Eu nunca usei o awk antes, e estou insanamente confuso. Aprecie qualquer ajuda neste pessoal. Eu estou usando o Ubuntu Linux, bash scripts. Posso extrair texto assim e transformá-los em variáveis usando o awk e o bash?

EDITAR:

Eu esqueci de mencionar que o arquivo 1 tem várias instâncias de x, yez. Pode ser acessado aqui: link

Existe uma maneira de começar em uma determinada linha? Por exemplo, z, y e x sempre estarão nas linhas 183, 184 e 185, respectivamente.

    
por user2809413 03.08.2014 / 14:54

2 respostas

2

Experimente este script:

#!/bin/bash

FILE1=/path/to/file1
FILE2=/path/to/file2

#extracting lines 183 to 185
FILE1=$(awk 'FNR>=183&&FNR<=185' $FILE1)

#extracting variables    
Z=$(echo "$FILE1" | grep z: | awk '{print $2}')
Y=$(echo "$FILE1" | grep y: | awk '{print $2}')
X=$(echo "$FILE1" | grep x: | awk '{print $2}')
#YAW=$(echo "$FILE1" | grep yaw: | awk '{print $2}')
#PITCH=$(echo "$FILE1" | grep pitch: | awk '{print $2}')

cat <<EOF > $FILE2
 world: mine
 x: $X
 y: $Y
 z: $Z
 yaw: 0.0
 pitch: 0.0
 name: mine
EOF

Se você quiser também extrair o YAW e o PITCH:

  • Altere a linha do awk para extrair da linha 181:

    FILE1=$(awk 'FNR>=181&&FNR<=185' $FILE1)
    
  • Remova o comentário das linhas YAW e PITCH

  • Altere a guinada: e arremesso: no final da página:

    yaw: $YAW
    pitch: $PITCH
    
por 03.08.2014 / 16:49
1

Você realmente precisa atribuir os valores às variáveis? Como os pares variable: value aparecem de forma idêntica na entrada e na saída, você pode simplesmente extraí-los textualmente, por exemplo,

$ awk '/mine:/,/allowFlight/ {if ($1 ~ /^[xyz]:/) print;}' file1.txt
      z: 256.5
      y: 62.0
      x: -223.5

Você poderia colocar isso diretamente em um documento aqui usando a substituição de comando, eu acho:

cat > file2.txt << EOF 
 world: mine
$(awk '/mine:/,/allowFlight/ {if ($1 ~ /^[xyz]:/) print " "$1,$2;}' file1.txt)
 yaw: 0.0
 pitch: 0.0
 name: mine
EOF

(Eu prettifiquei a saída um pouco usando print " "$1,$2 em vez de um simples print ).

    
por 03.08.2014 / 16:47