名前の異なる2つのファイルのリストを特定の順序でマージします。

名前の異なる2つのファイルのリストを特定の順序でマージします。

フォルダには6つのファイルで構成される2つのセットがあります。

最初のグループ:

1st-letter-00 - 1st-letter-05

2番目のグループ:

verse-00 - verse-05

結果が次のように上から下にすべてのファイルを含む単一のファイルになるように、これら2つのファイルセットを関連付けるにはどうすればよいですか?

Content of 1st-letter-00
Content of verse-00
Content of 1st-letter-01
Content of verse-01
etc.

質問が明確になりますように。

答え1

この答えには2つの解決策があります。

  1. あるグループのファイルを繰り返し、別のグループのファイル名を設定します。
  2. 数字を繰り返し、ループ内で2つのファイル名を設定します。

あるファイルセットを別のファイルセットとペアに関連付ける 1 つの方法は、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。次に、2つのファイルをリンクします。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、使用したい特定のゼロで埋められた数字を繰り返して、ループ内の両方のファイル名を設定することもできます。

for num in {00..05}; do
    cat "1st-letter-$num" "verse-$num"
done >result.txt

以前のバージョンbash(中括弧拡張でゼロで埋められた整数を実行しない)では、次のものを使用できます。

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

ここでは、必要に応じて拡張してより柔軟にすることができます。

関連情報