Substituição de uma linha por outra linha em múltiplos arquivos

3

Eu tenho que substituir o conteúdo das linhas de um arquivo com outra linha (na mesma posição número 3) em vários arquivos. O problema parece com o seguinte:

Input1

file.list <- list("a","b","c","d")
file.list <- list("d","e","f","g")
file.list <- list("h","i","l","m")

Input2.file

library(data.table)
library(dplyr)
file.list <- list("z","g","h","s","i")

Input3.file

library(data.table)
library(dplyr)
file.list <- list("s","p","q","r","m")

Input4.file

library(data.table)
library(dplyr)
file.list <- list("x","k","s","e")

Saída de Input2.file

library(data.table)
library(dplyr)
file.list <- list("a","b","c","d")

Saída de Input3.file

library(data.table)
library(dplyr)
file.list <- list("d","e","f","g")

Saída de Input4.file

library(data.table)
library(dplyr)
file.list <- list("h","i","l","m")

I have tried to do as follow:

filename='Input1'
for i in *.file; do #here i loop over the list of files
    while read p $filename; do #here i loop over the lines of Input1 file
        awk '{ if (NR == 3) print "$p"; else print $0}' $i > $i.test; ##here i substitute the line 1 in the files with the line that are in Input1 file
    done;
done

Estou fazendo algo errado porque o script está parando sem me dar nenhuma mensagem. O que estou fazendo errado? Qualquer ideia?

    
por fusion.slope 27.10.2017 / 14:48

2 respostas

2
$ gawk -i inplace '
    NR == FNR {repl[FNR] = $0; next} 
    FNR == 1  {filenum++} 
    FNR == 3  {$0 = repl[filenum]} 
    {print}
' Input1 Input{2,3,4}.file

$ cat Input2.file
library(data.table)
library(dplyr)
file.list <- list("a","b","c","d")

$ cat Input3.file
library(data.table)
library(dplyr)
file.list <- list("d","e","f","g")

$ cat Input4.file
library(data.table)
library(dplyr)
file.list <- list("h","i","l","m")

Olhando para o seu código:

  1. você está substituindo a linha 3 em cada * .file com cada linha de Input1. Você ficará com a última linha do Input1 como linha 3 para cada arquivo *.
  2. $p não pode ser expandido em seu script awk, porque está entre aspas simples.

Tente isto:

exec 3<Input1   # set up file descriptor 3 to read from Input1 file
for f in *.file; do
    read -r -u 3 replacement   # read a line from fd 3  
    awk -v rep="$replacement" '{if (NR == 3) print rep; else print $0}' "$f" > "$f.test"
done
exec 3<&-       # close fd 3
    
por 27.10.2017 / 15:49
0

to substitute the content of lines from a file with another line

Solução

bash + sed :

i=0; for f in Input[2-4].file; do ((i++)); sed -n "${i}p" "Input1" > "$f"; done

Visualizando resultados:

$ head Input[2-4].file
==> Input2.file <==
file.list <- list("a","b","c","d")

==> Input3.file <==
file.list <- list("d","e","f","g")

==> Input4.file <==
file.list <- list("h","i","l","m")
    
por 27.10.2017 / 15:07