根据文件名的第一个字符连接文件

根据文件名的第一个字符连接文件

在一个文件夹中,我有如下文件。

COUNTRY_US_20200401.TXT
COUNTRY_GB_20200401.TXT
COUNTRY_FR_20100328.TXT
COUNTRY_US_20200406.TXT
COUNTRY_GB_20200410.TXT

我想检查前 10 个字符,如果文件名匹配,那么我想连接如下文件 COUNTRY_US.TXTCOUNTRY_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

也就是说,如果输出文件存在并且大小大于零,则使用 从当前文件中删除第一行sed,否则就像cat以前一样使用。

相关内容