Linux

根據文件名的第一個字元連接文件

  • April 22, 2020

在一個文件夾中,我有如下文件。

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我該如何合併文件並且我希望最後刪除單個文件。

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像以前一樣使用。

引用自:https://unix.stackexchange.com/questions/581853