başka alternatif: Şu anda yayınlanan tüm çözümleri denemeye karar verdik
$ printf 'abc}def}ghi\n' | awk -v RS='}' -v ORS='}\n' 'NR>1{print p} {p=$0} END{printf "%s",p}'
abc}
def}
ghi
: Diğer awks ile
$ printf 'abc}def}ghi\n' | awk -v RS='}' '{ORS=(RT?"}\n":"")}1'
abc}
def}
ghi
Bir giriş filini kullanarak işlev ve yürütme süresi için Bu komutla oluşturulan e:
awk 'BEGIN{for(i=1;i<=1000000;i++)printf "foo}"; print "foo"}' > file1m
ve burada ne var yani:
time awk -v RS='}' '{ORS=(RT?"}\n":"")}1' file1m
beklenen var çıkışı, zamanlaması =
:
1) awk (her ikisi awk komut yukarıdaki benzer sonuçlar) vardı
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
real 1m52.152s
user 1m18.233s
sys 0m32.604s
3) tr+sed = çıkış zamanlama beklenen var:
$ time tr '}' '\n' < file1m | sed 's/$/}/'
eklendi beklenen çıktı (dosyanın sonuna istenmeyen }
) üretmemiştir, zamanlama =
real 0m0.577s
user 0m0.468s
sys 0m0.078s
bir çimdik ile bu son istenmeyen }
kaldırmak için:
$ 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'
çıkış zamanlama beklenen var =
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
real 0m0.983s
user 0m0.685s
sys 0m0.167s
Bir akış moda dosyanızı işlemek için 'jq' kullanarak düşünebilir = çıkış, zamanlama bekleniyor var. – chepner