Объединение файлов на основе первых символов имен файлов

Дайте этому сценарию список имен файлов в том порядке, в котором вы хотите установить их время модификации. Они будут расположены в порядке возрастания с интервалом в 1 секунду.

#!/bin/sh
# touch++: run touch to set mod time of file arguments,
# starting at indicated time and increasing by 1 second
# for each argument
# mp, 5/2/2018
usage() {
    echo "Usage: $0 -d \"date\" FILE..." >&2
}

while getopts "d:" opt
do
    case "$opt" in
        d)
            date="$OPTARG"
            ;;
        *)
            usage
            exit 1
            ;;
    esac
done
shift $((OPTIND-1))

if [ -z "$date" ]
then
    usage
    exit 1
fi
secs=$(date -d "$date" "+%s")
if [ $? != 0 ]
then
    usage
    exit 2
fi
echo setting times starting at $secs $(date -d "@$secs")
for f
do
    touch -m -t $(date -d "@$secs" "+%Y%m%d%H%M.%S") -- "$f"
    secs=$((secs + 1))
done
0
22.04.2020, 22:11
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, как и раньше.

1
19.03.2021, 02:26

Теги

Похожие вопросы