Z GNU awk dla RT
:
$ printf 'abc}def}ghi\n' | awk -v RS='}' '{ORS=(RT?"}\n":"")}1'
abc}
def}
ghi
z innymi implementacjami awk:
$ printf 'abc}def}ghi\n' | awk -v RS='}' -v ORS='}\n' 'NR>1{print p} {p=$0} END{printf "%s",p}'
abc}
def}
ghi
postanowiłem przetestować wszystkie aktualnie zamieszczonych rozwiązań dla funkcji i czasu wykonania przy użyciu pliku wejściowego e generowane przez komendę:
awk 'BEGIN{for(i=1;i<=1000000;i++)printf "foo}"; print "foo"}' > file1m
i oto co mam:
skrypty
1) awk (zarówno awk powyżej miały podobne wyniki):
time awk -v RS='}' '{ORS=(RT?"}\n":"")}1' file1m
Got oczekiwany wynik, czas =
real 0m0.608s
user 0m0.561s
sys 0m0.045s
2) shell loop:
$ cat tst.sh
#!/bin/bash
# as long as there exists another } in the file, read up to it...
while IFS= read -r -d '}' piece; do
# ...and print that content followed by '}' and a newline.
printf '%s}\n' "$piece"
done
# print any trailing content after the last }
[[ $piece ]] && printf '%s\n' "$piece"
$ time ./tst.sh < file1m
Posiadanie oczekiwany wynik, czas =
real 1m52.152s
user 1m18.233s
sys 0m32.604s
3) tr+sed:
$ time tr '}' '\n' < file1m | sed 's/$/}/'
nie przyniosły oczekiwanego wyjściowego (Dodano niepożądany }
na końcu pliku), termin =
real 0m0.577s
user 0m0.468s
sys 0m0.078s
Z wariację usunąć ten ostatni niepożądane }
:
$ time tr '}' '\n' < file1m | sed 's/$/}/; $s/}//'
real 0m0.718s
user 0m0.670s
sys 0m0.108s
4) fold+sed+tr:
$ time fold -w 1000 file1m | sed 's/}/}\n\n/g' | tr -s '\n'
Posiadanie oczekiwany wynik, czas =
real 0m0.811s
user 0m1.137s
sys 0m0.076s
5) split+sed+cat:
$ cat tst2.sh
mkdir tmp$$
pwd="$(pwd)"
cd "tmp$$"
split -b 1m "${pwd}/${1}"
sed -i 's/}/}\n/g' x*
cat x*
rm -f x*
cd "$pwd"
rmdir tmp$$
$ time ./tst2.sh file1m
Got oczekiwany wynik, czas =
real 0m0.983s
user 0m0.685s
sys 0m0.167s
Można rozważyć użycie 'jq' przetworzyć plik w modzie streamingu. – chepner