ファイル名の最初の文字に基づいてファイルを関連付ける

ファイル名の最初の文字に基づいてファイルを関連付ける

フォルダに次のファイルがあります。

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以前と同じように使用します。

関連情報