フォルダに次のファイルがあります。
COUNTRY_US_20200401.TXT
COUNTRY_GB_20200401.TXT
COUNTRY_FR_20100328.TXT
COUNTRY_US_20200406.TXT
COUNTRY_GB_20200410.TXT
最初の10文字を確認し、ファイル名が一致したら、次のようにファイルをリンクしたい
COUNTRY_US.TXT
(マージさCOUNTRY_US_20200401.TXT
れますCOUNTRY_US_20200406.TXT
)。
COUNTRY_GB.TXT
COUNTRY_FR.TXT
ファイル名をハードコードするとうまくいきますが、問題は明日、特定の名前COUNTRY_GR_20200319.TXT
の新しいファイルが到着したときにファイルをマージする方法で、最後に個々のファイルを削除したい場合です。
答え1
rm -f COUNTRY_??.TXT
for file in COUNTRY_??_*.TXT; do
cat "$file" >>"${file%_*.TXT}.TXT"
done
まず、マージされたファイルがないことを確認します。私たちはいつも追加マージされたファイルに追加されるため、そのファイルがすでに存在する場合は、コードを複数回実行すると結果ファイルのデータが重複する可能性があります。
その後、このファイルを繰り返します。私たちは、すべてのファイルがパターンCOUNTRY_??_*.TXT
(質問に出てくる名前)と一致すると仮定します。各ファイルに対して、対応するcat
マージファイルの末尾にデータを追加するだけです。マージされたファイルの名前は、最初に_*.TXT
ファイル名から一致する最も短いサフィックス文字列を削除し、それを最後に追加し直し.TXT
ます。
これをテストしてみてください。
$ ls
COUNTRY_FR_20100328.TXT COUNTRY_GB_20200410.TXT COUNTRY_US_20200406.TXT
COUNTRY_GB_20200401.TXT COUNTRY_US_20200401.TXT
(ここでループが実行されます)
$ ls
COUNTRY_FR.TXT COUNTRY_GB_20200401.TXT COUNTRY_US_20200401.TXT
COUNTRY_FR_20100328.TXT COUNTRY_GB_20200410.TXT COUNTRY_US_20200406.TXT
COUNTRY_GB.TXT COUNTRY_US.TXT
各新しいファイルは、名前に日付を含むそのファイルを関連付けたものです。
コメントに追加の要件が追加されました。最初のマージファイルを除くすべてのファイルからヘッダーを削除します。
rm -f COUNTRY_??.TXT
for file in COUNTRY_??_*.TXT; do
outfile=${file%_*.TXT}.TXT
if [ -s "$outfile" ]; then
sed 1d "$file"
else
cat "$file"
fi >>"$outfile"
done
つまり、出力ファイルが存在し、サイズが0より大きい場合は現在のファイルから最初の行を削除しsed
、それ以外の場合はcat
以前と同じように使用します。