フォルダには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つの解決策があります。
- あるグループのファイルを繰り返し、別のグループのファイル名を設定します。
- 数字を繰り返し、ループ内で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-
$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
、使用したい特定のゼロで埋められた数字を繰り返して、ループ内の両方のファイル名を設定することもできます。
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
。
ここでは、必要に応じて拡張してより柔軟にすることができます。