폴더에는 6개 파일로 구성된 두 세트가 있습니다.
첫 번째 그룹:
1st-letter-00 - 1st-letter-05
두 번째 그룹:
verse-00 - verse-05
결과가 다음과 같이 위에서 아래로 모든 파일을 포함하는 단일 파일이 되도록 이 두 파일 세트를 연결하려면 어떻게 해야 합니까?
Content of 1st-letter-00
Content of verse-00
Content of 1st-letter-01
Content of verse-01
etc.
질문이 명확해지기를 바랍니다.
답변1
이 답변에는 두 가지 솔루션이 있습니다.
- 한 그룹의 파일을 반복하고 다른 그룹의 파일 이름을 구성합니다.
- 숫자를 반복하고 루프 내에서 두 개의 파일 이름을 구성합니다.
한 파일 세트를 다른 파일 세트와 쌍으로 연결하는 한 가지 방법은 한 파일 세트를 반복하여 해당 파일에서 다른 파일 이름 세트를 구성하는 것입니다. 이는 파일 이름 접미사가 무엇인지 또는 그룹에 파일이 몇 개 있는지 정확히 알지 못하지만 여전히 한 그룹의 파일을 다른 그룹의 파일과 일치시키려는 경우에 유용합니다.
for verse in verse-*; do
letter1=1st-letter-${verse#verse-}
cat "$letter1" "$verse"
done >result.txt
... 아니면 그냥
for verse in verse-*; do cat "1st-letter-${verse#verse-}" "$verse"; done >result.txt
이것은 현재 디렉토리의 문자열로 시작하는 모든 이름을 반복합니다 verse-
. 여기에는 모든 파일 verse-00
등이 포함됩니다 . verse-01
처음 6개만 일치하는지 확인하려는 경우(또는 다음과 같은 경우)다른동일한 파일 이름 접두사를 가진 파일) verse-0[0-5]
의 경우 verse-*
.
각 반복에서 해당 파일의 이름은 현재 값에서 접두사를 제거하고 문자열 앞에 추가하여 구성됩니다 1st-letter
. 그런 다음 두 파일을 연결합니다.verse-
$verse
1st-letter-
전체 루프의 출력이 기록됩니다 result.txt
.
시험:
$ ls -l
total 48
-rw-r--r-- 1 kk wheel 26 Nov 19 11:48 1st-letter-00
-rw-r--r-- 1 kk wheel 26 Nov 19 11:48 1st-letter-01
-rw-r--r-- 1 kk wheel 26 Nov 19 11:48 1st-letter-02
-rw-r--r-- 1 kk wheel 26 Nov 19 11:48 1st-letter-03
-rw-r--r-- 1 kk wheel 26 Nov 19 11:48 1st-letter-04
-rw-r--r-- 1 kk wheel 26 Nov 19 11:48 1st-letter-05
-rw-r--r-- 1 kk wheel 21 Nov 19 11:48 verse-00
-rw-r--r-- 1 kk wheel 21 Nov 19 11:48 verse-01
-rw-r--r-- 1 kk wheel 21 Nov 19 11:48 verse-02
-rw-r--r-- 1 kk wheel 21 Nov 19 11:48 verse-03
-rw-r--r-- 1 kk wheel 21 Nov 19 11:48 verse-04
-rw-r--r-- 1 kk wheel 21 Nov 19 11:48 verse-05
위의 루프가 여기에서 실행됩니다.
$ cat result.txt
Contents of 1st-letter-00
Contents of verse-00
Contents of 1st-letter-01
Contents of verse-01
Contents of 1st-letter-02
Contents of verse-02
Contents of 1st-letter-03
Contents of verse-03
Contents of 1st-letter-04
Contents of verse-04
Contents of 1st-letter-05
Contents of verse-05
너무 오래되지 않은 버전을 사용하거나 bash
(macOS의 기본 버전은 bash
너무 오래됨) zsh
또는 를 사용하고 yash
, 사용하려는 특정 0으로 채워진 숫자를 반복하여 루프에서 두 파일 이름을 모두 구성할 수도 있습니다.
for num in {00..05}; do
cat "1st-letter-$num" "verse-$num"
done >result.txt
이전 버전 bash
(중괄호 확장에서 0으로 채워진 정수를 수행하지 않음)에서는 다음을 사용할 수 있습니다.
for num in 0{0..5}; do
cat "1st-letter-$num" "verse-$num"
done >result.txt
...그리고 그 이상의 숫자를 포함하면 9
다음을 사용할 수 있습니다.
for num in 0{0..9} {10..99}; do
cat "1st-letter-$num" "verse-$num"
done >result.txt
00
이것 은 숫자 를 다룰 것입 니다 99
.
답변2
솔루션이 얼마나 유연해야 하는지에 따라 많은 것이 달라집니다. 이러한 파일이 항상 호출된다는 1st-letter-NN
것을 알고 있다면 verse-NN
쉘 스크립트에서 이와 같은 작업을 수행할 수 있습니다.
#!/bin/bash
OUTFILE=$1 # take output file from command-line
:>$OUTFILE # and initialize it as "empty" in case it already existed
for i in {00..05}
do
cat 1st-letter-$i >> $OUTFILE
cat verse-$i >> $OUTFILE
done
그런 다음 이 스크립트를 다음과 같이 호출할 수 있습니다.
user@host$ ./my_script.sh merged_content.txt
병합된 콘텐츠가 파일에 표시됩니다 merged_content.txt
.
여기에서 필요에 따라 확장하여 더욱 유연하게 만들 수 있습니다.