Bash - 在按日期排序的目录中连接文件
Bash - Concatenate files in a directory ordered by date
我正在编写一个简单的脚本,需要一些帮助。该脚本将包含以下文件的目录作为输入:
FILENAME20160220.TXT
FILENAME20160221.TXT
FILENAME20160222.TXT
...
脚本需要将目录作为输入,将它们连接到一个名为 :
的新文件中
FILENAME.20160220_20160222.TXT
以上文件名需要有它找到的 "Earliest"_"Latest" 日期。到目前为止我编写的脚本是这样的,但它不会产生必要的输出。有人可以帮我修改一下吗?
declare FILELISTING="FILELISTING.TXT"
declare SOURCEFOLDER="/Cat_test/cat_test/"
declare TEMPFOLDER="/Cat_Test/cat_test/temp/"
# Create temporary folder
cd $SOURCEFOLDER
mkdir $TEMPFOLDER
chk_abnd $?
# Move files into temporary folder
mv *.TXT $SOURCEFOLDER $TEMPFOLDER
chk_abnd $?
# Change directory to temporary folder
cd $TEMPFOLDER
chk_abnd $?
# Iterate through files in temp folder and create temporary listing files
for FILE in $TEMPFOLDER
do
echo $FILE >> $FILELISTING
done
# Iterate through the lines of FILELISTING and store dates into array for sorting
while read lines
do
array[$i] = "${$line:x:y}"
(( i++ ))
done <$FILELISTING
# Sort dates in array
for ((i = 0; i < $n ; i++ ))
do
for ((j = $i; j < $n; j++ ))
do
if [ $array[$i] -gt $array[$j] ]
then
t=${array[i]}
array[$i]=${array[$j]}
array[$j]=$t
fi
done
done
# Get first and last date of array and construct output filename
OT_FILE=FILENAME.${array[1]}_${array[-1]}.txt
# Sort files in folder
# Cat files into one
cat *.ACCT > "$OT_FILE.temp"
chk_abnd $?
# Remove Hex 1A
# tr '\x1A' '' < "$OT_FILE.temp" > $OT_FILE
# Cleanup - Remove File Listing
rm $FILE_LISTING
chk_abnd $?
rm $OT_FILE.temp
chk_abnd $?
这里有一些提示,cat
完成了大部分工作。
如果您的文件名具有固定大小的日期字段,如您的示例所示,词汇排序就足够了。
ls -1 FILENAME* > allfiles
aggname=$(cat allfiles | sed -rn '1s/([^0-9]*)/./p;$s/[^0-9]*//p' |
paste -sd-)
cat allfiles | xargs cat > $aggname
您可以将最后两个步骤合二为一,但这样可读性更好。
不要重新发明轮子。
假设您的文件的基本列表可以使用 FILENAME*.TXT
识别,这很简单,ls
可用于生成一个有序列表,默认情况下按字母顺序升序排列,并且因此(由于您选择的日期格式)按日期升序排列。
您可以获得最早和最晚日期如下:
$ earliest=$( ls -1 FILENAME*.TXT | head -1 | cut -c9-16 )
$ echo $earliest
20160220
$ latest=$( ls -1 FILENAME*.TXT | tail -1 | cut -c9-16 )
$ echo $latest
20160222
因此您的文件名可以使用:
filename="FILENAME.${earliest}_${latest}.TXT"
连接应该像这样简单:
cat $( ls -1 FILENAME*.TXT ) > ${filename}
不过,如果您正在写入同一目录,您可能希望先将输出定向到一个不符合此模式的临时名称,然后再重命名它。也许是这样的:
earliest=$( ls -1 FILENAME*.TXT | head -1 | cut -c9-16 )
latest=$( ls -1 FILENAME*.TXT | tail -1 | cut -c9-16 )
filename="FILENAME.${earliest}_${latest}.TXT"
cat $( ls -1 FILENAME*.TXT ) > temp_${filename}
mv temp_${filename} ${filename}
我正在编写一个简单的脚本,需要一些帮助。该脚本将包含以下文件的目录作为输入:
FILENAME20160220.TXT
FILENAME20160221.TXT
FILENAME20160222.TXT
...
脚本需要将目录作为输入,将它们连接到一个名为 :
的新文件中FILENAME.20160220_20160222.TXT
以上文件名需要有它找到的 "Earliest"_"Latest" 日期。到目前为止我编写的脚本是这样的,但它不会产生必要的输出。有人可以帮我修改一下吗?
declare FILELISTING="FILELISTING.TXT"
declare SOURCEFOLDER="/Cat_test/cat_test/"
declare TEMPFOLDER="/Cat_Test/cat_test/temp/"
# Create temporary folder
cd $SOURCEFOLDER
mkdir $TEMPFOLDER
chk_abnd $?
# Move files into temporary folder
mv *.TXT $SOURCEFOLDER $TEMPFOLDER
chk_abnd $?
# Change directory to temporary folder
cd $TEMPFOLDER
chk_abnd $?
# Iterate through files in temp folder and create temporary listing files
for FILE in $TEMPFOLDER
do
echo $FILE >> $FILELISTING
done
# Iterate through the lines of FILELISTING and store dates into array for sorting
while read lines
do
array[$i] = "${$line:x:y}"
(( i++ ))
done <$FILELISTING
# Sort dates in array
for ((i = 0; i < $n ; i++ ))
do
for ((j = $i; j < $n; j++ ))
do
if [ $array[$i] -gt $array[$j] ]
then
t=${array[i]}
array[$i]=${array[$j]}
array[$j]=$t
fi
done
done
# Get first and last date of array and construct output filename
OT_FILE=FILENAME.${array[1]}_${array[-1]}.txt
# Sort files in folder
# Cat files into one
cat *.ACCT > "$OT_FILE.temp"
chk_abnd $?
# Remove Hex 1A
# tr '\x1A' '' < "$OT_FILE.temp" > $OT_FILE
# Cleanup - Remove File Listing
rm $FILE_LISTING
chk_abnd $?
rm $OT_FILE.temp
chk_abnd $?
这里有一些提示,cat
完成了大部分工作。
如果您的文件名具有固定大小的日期字段,如您的示例所示,词汇排序就足够了。
ls -1 FILENAME* > allfiles
aggname=$(cat allfiles | sed -rn '1s/([^0-9]*)/./p;$s/[^0-9]*//p' |
paste -sd-)
cat allfiles | xargs cat > $aggname
您可以将最后两个步骤合二为一,但这样可读性更好。
不要重新发明轮子。
假设您的文件的基本列表可以使用 FILENAME*.TXT
识别,这很简单,ls
可用于生成一个有序列表,默认情况下按字母顺序升序排列,并且因此(由于您选择的日期格式)按日期升序排列。
您可以获得最早和最晚日期如下:
$ earliest=$( ls -1 FILENAME*.TXT | head -1 | cut -c9-16 )
$ echo $earliest
20160220
$ latest=$( ls -1 FILENAME*.TXT | tail -1 | cut -c9-16 )
$ echo $latest
20160222
因此您的文件名可以使用:
filename="FILENAME.${earliest}_${latest}.TXT"
连接应该像这样简单:
cat $( ls -1 FILENAME*.TXT ) > ${filename}
不过,如果您正在写入同一目录,您可能希望先将输出定向到一个不符合此模式的临时名称,然后再重命名它。也许是这样的:
earliest=$( ls -1 FILENAME*.TXT | head -1 | cut -c9-16 )
latest=$( ls -1 FILENAME*.TXT | tail -1 | cut -c9-16 )
filename="FILENAME.${earliest}_${latest}.TXT"
cat $( ls -1 FILENAME*.TXT ) > temp_${filename}
mv temp_${filename} ${filename}