concatenação múltipla de strings sem gravar arquivos intermediários

0

Eu gostaria de extrair partes de alguns arquivos e concatená-los em outro, mas sem escrever um arquivo intermediário.

Por exemplo:

$ cat textExample.txt 
Much I marvelled this ungainly fowl to hear discourse so plainly,
Though its answer little meaning- little relevancy bore;
For we cannot help agreeing that no living human being
Ever yet was blessed with seeing bird above his chamber door-
Bird or beast upon the sculptured bust above his chamber door,
With such name as "Nevermore."
$ cat textExample.txt | tr -d "\n" | awk 'NR==1' | awk '{print substr($0, 8, 9)}'
marvelled
$ cat textExample.txt | tr -d "\n" | awk 'NR==1' | awk '{print substr($0, 77, 6)}'
answer
$ cat textExample.txt | tr -d "\n" | awk 'NR==1' | awk '{print substr($0, 189, 7)}'
blessed

Para concatenar as frases juntas, um arquivo pode ser escrito:

$ cat textExample.txt | tr -d "\n" | awk 'NR==1' | awk '{print substr($0, 8, 9)}'| tr "\n" " " > intermediate.txt
$ cat textExample.txt | tr -d "\n" | awk 'NR==1' | awk '{print substr($0, 77, 6)}' | tr "\n" " " >> intermediate.txt
$ cat textExample.txt | tr -d "\n" | awk 'NR==1' | awk '{print substr($0, 189, 7)}' >> intermediate.txt
$ cat intermediate.txt 
marvelled answer blessed

ou vários comandos awk podem ser usados (embora eu não possa remover a nova linha):

$ cat textExample.txt | tr -d "\n" | awk 'NR==1' | awk '{print substr($0, 8, 9)}; {print substr($0, 77, 6)}; {print substr($0, 189, 7)}' 
marvelled
answer
blessed

Eu queria saber se cat poderia ser usado diretamente para concatenar as diferentes palavras juntas sem depender de um arquivo intermediário, algo como:

$ cat {first word} | cat {second word} | cat {third word} 
first second third

Obrigado

    
por Gigiux 10.04.2018 / 12:39

3 respostas

0

Isso funciona para mim se eu entendi corretamente:

cat textExample.txt | tr -d "\n" | awk '{print substr($0, 8, 9) " " substr($0, 77, 6) " " substr($0, 189, 7)}'
    
por 10.04.2018 / 12:58
0

Eu não entendo o que você pretende.

Tente ainda:

 ... | tr -d '\n' |
awk '{printf "%s %s %s\n", substr($0, 8, 9),substr($0, 77, 6),substr($0, 189, 7)}'

que dão com sua entrada

tr -d '\n' < se | awk '{printf "%s %s %s\n", substr($0, 8, 9),substr($0, 77, 6),substr($0, 189, 7)}'
marvelled answer blessed
  • dê uma olhada em printf , que por padrão não termina com uma nova linha (ao contrário de print )

note também você pode usar subshell

( cmd1 arg 1
 cmd2 arg for 2
 cmd 3 ) > result

que colocará a saída de cmd s em result .

    
por 10.04.2018 / 12:58
0

Com bash

cat extract_words.sh

#!/bin/bash
concat=" "
min=$(($6+$7))
while read line
do
  concat="$concat$line"
  if test "${#concat}" -ge "$min" ; then
    break
  fi
done < "$1"
echo "${concat:$2:$3}" "${concat:$4:$5}" "${concat:$6:$7}"

Você chama assim

./extract_words.sh "textExample.txt" 8 9 77 6 189 7
    
por 10.04.2018 / 18:05