Как разбить файл на абзацы и назвать результирующие части на основе идентификатора, присутствующего в каждом абзаце

#!/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}"
0
12.10.2018, 22:11
3 ответа

Если абзацы в данных имеют одинаковый формат (, т.е. десять строк в абзаце ), то команда 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
0
28.01.2020, 02:18

С 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 
4
28.01.2020, 02:18

Для извлечения имени файла потребуется первая строка «Идентификатор»:

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на пустое место.

0
28.01.2020, 02:18

Теги

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