여러 파일에서 한 줄을 다른 줄로 바꾸기

여러 파일에서 한 줄을 다른 줄로 바꾸기

한 파일의 한 줄 내용을 여러 파일의 다른 줄(동일한 위치 번호 3)로 바꿔야 합니다. 문제는 다음과 같습니다.

1을 입력하세요

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

2.파일 입력

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

3.파일 입력

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

4.파일 입력

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

Input2.file의 출력

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

Input3.file의 출력

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

Input4.file의 출력

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

나는 다음을 시도합니다 :

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

아무런 메시지도 표시하지 않고 스크립트가 중지되기 때문에 뭔가 잘못된 일을 하고 있는 것입니다. 내가 뭘 잘못했나요? 어떤 아이디어가 있나요?

답변1

$ 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")

코드를 확인하세요.

  1. 각 *.file의 3행을 Input1의 각 행으로 바꿉니다. 각 *.file에 대한 3번째 줄로 Input1의 마지막 줄이 표시됩니다.
  2. $p작은따옴표로 묶여 있으므로 awk 스크립트에서는 확장할 수 없습니다.

이 시도:

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

답변2

파일의 한 줄 내용을 다른 줄로 바꾸기

bash+sed해결책:

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

결과 보기:

$ 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")

관련 정보