Bash - 按日期排序的目录中的连接文件

时间:2016-03-18 11:02:13

标签: bash sorting date cat sorted

我需要一些简单的脚本帮助我写作。该脚本将包含以下内容的文件作为输入:

FILENAME20160220.TXT
FILENAME20160221.TXT
FILENAME20160222.TXT
...

脚本需要将目录作为输入,将它们连接到一个名为:

的新文件中
FILENAME.20160220_20160222.TXT 

以上文件名需要有最早的" _"最新"它发现的日期。到目前为止我写的脚本是这样的,但它不会产生必要的输出。有人能帮助我修补它吗?

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 $?

2 个答案:

答案 0 :(得分:1)

以下是一些提示,cat完成了大部分工作。 如果您的文件名具有固定大小的日期字段,如您的示例所示,词法排序就足够了。

ls -1 FILENAME* > allfiles
aggname=$(cat allfiles |  sed -rn '1s/([^0-9]*)/\1./p;$s/[^0-9]*//p' | 
paste -sd-)
cat allfiles | xargs cat > $aggname

你可以将最后两个步骤合并为一个,但这种方式更具可读性。

不要重新发明轮子。

答案 1 :(得分:1)

假设您的文件的基本列表可以使用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}