각 복사본에서 한 줄을 변경하여 파일의 여러 복사본을 만듭니다.

각 복사본에서 한 줄을 변경하여 파일의 여러 복사본을 만듭니다.

시뮬레이션을 자동화해야 하며 이를 위해 각 시뮬레이션에 대한 입력 파일을 생성해야 합니다. 내 시뮬레이션의 대부분은 거의 동일하며 한 파일에서 다음 파일로 텍스트 줄이 변경됩니다. 특정 줄이 변경되면 어떻게 텍스트 파일을 가져와서 여러 복사본을 만들 수 있나요? 예를 들어, 텍스트 파일에 다음이 포함되어 있는 경우:

! input file
a = 6
b = 6
d = 789
! end

이 템플릿에서 6개의 새 파일을 만들고 싶지만 각 후속 파일에서 내 변수 b가 1씩 감소한다고 가정해 보겠습니다. Bash 또는 Python에서 이 작업을 어떻게 수행합니까?

답변1

기본 접근 방식은 이와 유사할 수 있습니다. 예에서는 a= 값 bye 번호 & 파일 & 파일 이름도 내부 값을 가지므로 구분된 파일로 수정합니다.

#!/bin/bash


for i in a b c 1 2 3  ; do
    cat > file${i} << EOT
! input file
a = ${i}
b = 6
d = 789
! end
EOT
done

따라서 6개의 서로 다른 콘텐츠가 포함된 6개의 파일을 얻게 됩니다.

# cat file?
! input file
a = 1
b = 6
d = 789
! end
! input file
a = 2
b = 6
d = 789
! end
! input file
a = 3
b = 6
d = 789
! end
! input file
a = a
b = 6
d = 789
! end
! input file
a = b
b = 6
d = 789
! end
! input file
a = c
b = 6
d = 789
! end

예를 들어 참조 파일에서 b 값을 읽어야 하는 경우 read 하위 명령에서 변수를 사용할 수 있습니다.

while read ; do
cat > file${REPLY} << EOT
! input file
a = 1
b = ${REPLY}
d = 789
! end
EOT
done < referencefile

실제 상황의 전체 예:

[root@h2g2w tmp]# cat > ./test.sh
while read ; do
cat > file${REPLY} << EOT
! input file
a = 1
b = ${REPLY}
d = 789
! end
EOT
done < referencefile


[root@h2g2w tmp]# cat > referencefile 
qsd
gfd
eza
vxcv
bxc
[root@h2g2w tmp]# 
[root@h2g2w tmp]# sh ./test.sh 
[root@h2g2w tmp]# ls -lrth file???
-rw-r--r--. 1 root root 41 28 juin  22:47 fileqsd
-rw-r--r--. 1 root root 41 28 juin  22:47 filegfd
-rw-r--r--. 1 root root 41 28 juin  22:47 fileeza
-rw-r--r--. 1 root root 41 28 juin  22:47 filebxc
[root@h2g2w tmp]# cat file???
! input file
a = 1
b = bxc
d = 789
! end
! input file
a = 1
b = eza
d = 789
! end
! input file
a = 1
b = gfd
d = 789
! end
! input file
a = 1
b = qsd
d = 789
! end
[root@h2g2w tmp]# 

이제 귀하의 필요에 맞게 조정할 수 있기를 바랍니다.

답변2

Bash만 사용: 파일 이름은 "file"입니다.

# slurp the whole file into a variable
contents=$(< file)

# find the value of b, using regular expression
# - with bash regex, the literal parts are quoted and the metachars are not
if [[ $contents =~ "b = "([0-9]+) ]]; then
    b_val=${BASH_REMATCH[1]}

    # create a printf-style format string
    template=${contents/b = $b_val/b = %d}

    # then, count down from the b value to 1, creating the new files
    for (( n = b_val; n >= 1; n-- )); do
        printf "$template\n" $n > "file.$n"
    done
fi

그 다음에:

$ ls -lt
total 6220
-rw-rw-r-- 1 jackman jackman      39 Jun 28 17:46 file.1
-rw-rw-r-- 1 jackman jackman      39 Jun 28 17:46 file.2
-rw-rw-r-- 1 jackman jackman      39 Jun 28 17:46 file.3
-rw-rw-r-- 1 jackman jackman      39 Jun 28 17:46 file.4
-rw-rw-r-- 1 jackman jackman      39 Jun 28 17:46 file.5
-rw-rw-r-- 1 jackman jackman      39 Jun 28 17:46 file.6
-rw-rw-r-- 1 jackman jackman      39 Jun 28 17:35 file
...

$ grep ^b file{,.?}
file:b = 6
file.1:b = 1
file.2:b = 2
file.3:b = 3
file.4:b = 4
file.5:b = 5
file.6:b = 6

관련 정보