다음을 포함하는 파일 1이 있습니다.
AAAAAA
BBBBBB
다음을 포함하는 파일 2가 있습니다.
11111 22222 33333
파일 3에는 다음이 포함됩니다.
22222 11111 33333
파일 1의 각 줄을 파일 2와 3에 삽입하여 "11111"을 바꾸고 매번 새 파일을 만들고 싶습니다. 따라서 최종 결과는 4개의 파일입니다.
파일 1:
AAAAAA2222233333
파일 2:
BBBBBB2222233333
파일 3:
22222AAAAAA33333
파일 4:
22222BBBBBB33333
값을 대체하기 위해 중첩된 for 루프와 sed를 사용해 보았지만 현재는 작동하지 않습니다. (디렉토리 /*에는 파일 2와 파일 3이 포함되어 있습니다.)
FILES=/directory/*
cat file1 | while read line ;do
for f in $FILES; do
cat $f | sed 's/11111/$i/g' > newfiles/$f$i.txt
done
done
스크립트를 실행할 때마다 편집해야 할 파일 수가 다를 수 있으므로 디렉터리를 반복하여 모든 파일이 포함되는지 확인하고 싶습니다. 파일 1에도 다른 개수의 문자열이 있습니다.
답변1
대체 파일을 반복한 다음 대상 파일을 반복해야 합니다. 거의 다 온 것 같아요. 다음과 비슷한 것이 있습니다(와일드카드가 작동하도록 일부 파일 이름을 바꿨습니다).
!/bin/bash
i=1
FILES=./other_file*
while read r; do
for f in $FILES; do
sed "s/11111/$r/g" > newfiles/file$i.txt < $f
i=$(( i + 1 ))
done
done <file1
여기서는 먼저 bash를 쉘로 사용하고 있음을 나타냅니다. 그런 다음 카운터를 i
1로 설정합니다. 다음으로 glob
파일을 변수에 넣습니다. file1을 반복하고 각 행을 변수에 할당합니다 r
. 그런 다음 각 파일에 대해 11111
문자열을 해당 줄에 표시되는 것과 일치시킵니다. 이름에 카운터를 사용하여 새 파일로 출력한 다음 카운터를 증가시킵니다. 주기가 완료될 때까지 반복합니다.
답변2
어크는 어때? 매핑을 file1
연관 배열에 저장한 다음 다른 파일의 각 줄에 대해 배열을 반복합니다.
awk -v OFS= '
NR==FNR {t[NR]=$0; next}
{s = $0}
{
for(i in t) {
$0 = s;
sub(/11111/,t[i]);
$1=$1;
print > "newfile" ++n
}
}' file1 file2 file3
( OFS=
그리고 $1=$1
필드 사이의 공백을 제거하기 위해 빈 필드 구분 기호를 사용하여 레코드를 강제로 재평가하도록 합니다.) 결과:
$ head newfile*
==> newfile1 <==
AAAAAA2222233333
==> newfile2 <==
BBBBBB2222233333
==> newfile3 <==
22222AAAAAA33333
==> newfile4 <==
22222BBBBBB33333
답변3
나는 동일한 결과를 얻기 위해 다음 스크립트를 사용합니다.
for i in `cat mainfile`; do sed "s/11111/$i/g" file1 |sed -r "s/\s+//g" >file1_$i; sed "s/11111/$i/g" file2|sed -r "s/\s+//g" >file2_$i;done
산출
4개 파일 모두의 출력을 찾으십시오.
AAAAAA2222233333
============================
BBBBBB2222233333
============================
22222AAAAAA33333
============================
22222BBBBBB33333
==========================
==