이름이 다른 두 개의 파일 목록을 특정 순서로 병합합니다.

이름이 다른 두 개의 파일 목록을 특정 순서로 병합합니다.

폴더에는 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

이 답변에는 두 가지 솔루션이 있습니다.

  1. 한 그룹의 파일을 반복하고 다른 그룹의 파일 이름을 구성합니다.
  2. 숫자를 반복하고 루프 내에서 두 개의 파일 이름을 구성합니다.

한 파일 세트를 다른 파일 세트와 쌍으로 연결하는 한 가지 방법은 한 파일 세트를 반복하여 해당 파일에서 다른 파일 이름 세트를 구성하는 것입니다. 이는 파일 이름 접미사가 무엇인지 또는 그룹에 파일이 몇 개 있는지 정확히 알지 못하지만 여전히 한 그룹의 파일을 다른 그룹의 파일과 일치시키려는 경우에 유용합니다.

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-$verse1st-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.

여기에서 필요에 따라 확장하여 더욱 유연하게 만들 수 있습니다.

관련 정보