在一个文件夹中,我有如下文件。
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
也就是说,如果输出文件存在并且大小大于零,则使用 从当前文件中删除第一行sed
,否则就像cat
以前一样使用。