#!/bin/sh
PROG="$(basename $0)"
DIR="${HOME}/.cache/${PROG}"
mkdir -p "${DIR}"
EXPIRY=600 # default to 10 minutes
[ "$1" -eq "$1" ] 2>/dev/null && EXPIRY=$1 && shift
CMD="$@"
HASH=$(echo "$CMD" | md5sum | awk '{print $1}')
CACHE="$DIR/$HASH"
test -f "${CACHE}" && [ $(expr $(date +%s) - $(date -r "$CACHE" +%s)) -le $EXPIRY ] || "$CMD" > "${CACHE}"
cat "${CACHE}"
Если абзацы в данных имеют одинаковый формат (, т.е. десять строк в абзаце ), то команда split
очень эффективна(split man).
#!/bin/bash
#remove blank lines from the original dataset.
awk NF original_data.txt > Free_spaces_data.txt
# split the dataset into files (paragraph per file), each paragraph is 10 lines.
split -l 10 Free_spaces_data.txt new
#rename the files based on the internal name within each paragraph
for f in./new*?; do
name=$(cat $f | awk -F'"' '/Name/{print $2}')
mv "${f}" "${name}.txt";
done
С GNU awk
gawk -v RS="" '
match($0, /Identifier "([^"]+)/, m) {
print > (m[1]".txt")
close(m[1]".txt")
}
' sample.txt
С Perl, используя удобный путь ::Крошечный модуль из CPAN
perl -MPath::Tiny -00 -ne '/Identifier "(.+?)"/ and path("$1.txt")->spew($_)' sample.txt
Для извлечения имени файла потребуется первая строка «Идентификатор»:
awk '
!/^ *$/ {BUF = BUF RS $0
}
! FN &&
/Identifier/ {FN = $NF ".txt"
gsub (/"/, "", FN)
}
/END JOB/ {print BUF > FN
BUF = FN = ""
}
' file
Он пропускает пустые строки, добавляет фактическую строку в буфер, создает имя файла в первом (FN пустом )вхождении «Идентификатор», удаляя все "
, и печатает буфер в END JOB
, сброс BUF
и FN
на пустое место.