Localize duas cadeias de caracteres variáveis e escreva uma como um arquivo [closed]

0

Eu tenho um documento de texto que contém duas linhas de informação. A linha 1 contém um nome de arquivo e a linha 2 contém um ID de referência. O documento contém outras strings além das informações desejadas e estou tentando criar uma maneira não desordenada de coletar apenas as informações que desejo. Usando 'cut -d' um monte de vezes parece desleixado.

Aqui está um exemplo dos meus dados

12:"content":"file;\r\n\tfilename=\"TestingFile.txt"} 
13-"refid":"9B46BCAEDC9923"}]

Usando essa informação, eu quero criar um arquivo chamado TestingFile.txt e escrever o valor refid como o conteúdo - basicamente os valores entre o "" e nada mais.

tfilename = \ " e refid": " sempre precederão os dados que eu estou procurando, e sempre haverá alguns caracteres após o final < strong> " na linha.

    
por BeMy Friend 24.10.2014 / 06:22

1 resposta

2

awk -F'"' 'NR==1 {fname=$(NF-1);} NR==2{print $(NF-1) >fname;}' file

Explicação

awk implicitamente percorre todas as linhas de um arquivo. Cada linha é dividida em campos.

  • -F'"'

    Isso faz com que a função de caractere de aspas duplas seja o separador de campos. Olhando para a entrada de exemplo, isso significa que os campos que queremos serão os segundos restantes em cada linha

  • NR==1 {fname=$(NF-1);}

    A primeira linha tem o nome do arquivo. Em awk , NF é o número de campos em uma linha. Portanto, $(NF-1) referencia o segundo ao último campo. Seu conteúdo é salvo na variável fname .

  • NR==2{print $(NF-1) >fname;}

    A segunda linha tem o ID como o segundo ao último campo. Nós print este ID para um arquivo chamado fname .

Exemplo

Se o código acima for executado na entrada de amostra, um arquivo TestingFile.txt será criado no diretório atual:

$ cat TestingFile.txt
9B46BCAEDC9923

Entrada mais complexa

Suponha que o arquivo de entrada se pareça com:

12:"content":"file;\r\n\tfilename=\"TestingFile.txt","date":"2014-10-23"} 
13-"refid":"9B46BCAEDC9923","author":"Anon"}]

Como nossos dados não serão mais os segundos para os últimos campos, precisamos alterar o código awk :

awk -F'"' 'NR==1 {sub(/.*tfilename=\"/, "");fname=$1;} NR==2 {sub(/.*refid":"/,"");print $1>fname;}' file2

Este código remove todos os caracteres antes do nome do arquivo (linha 1) ou ID (linha 2). Depois disso, as informações que desejamos estarão no campo 1. O código é o mesmo.

    
por John1024 24.10.2014 / 06:29