Linux
根據文件名的第一個字元連接文件
在一個文件夾中,我有如下文件。
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
我該如何合併文件並且我希望最後刪除單個文件。
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
像以前一樣使用。