के साथ एक और विकल्प:
$ printf 'abc}def}ghi\n' | awk -v RS='}' -v ORS='}\n' 'NR>1{print p} {p=$0} END{printf "%s",p}'
abc}
def}
ghi
मैं वर्तमान में तैनात समाधान के सभी परीक्षण करने का फैसला:
$ printf 'abc}def}ghi\n' | awk -v RS='}' '{ORS=(RT?"}\n":"")}1'
abc}
def}
ghi
अन्य awks साथ
एक इनपुट फाइल का उपयोग कर कार्यक्षमता और निष्पादन समय के लिए इस आदेश के द्वारा उत्पन्न ई:
awk 'BEGIN{for(i=1;i<=1000000;i++)printf "foo}"; print "foo"}' > file1m
और यहाँ है कि मैं क्या मिला:
time awk -v RS='}' '{ORS=(RT?"}\n":"")}1' file1m
उम्मीद गया उत्पादन, समय =
:
1) awk (दोनों awk स्क्रिप्ट ऊपर इसी तरह के परिणाम) था
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:
$ time tr '}' '\n' < file1m | sed 's/$/}/'
उम्मीद निर्गम (जोड़ी एक अवांछनीय }
फ़ाइल के अंत में) का उत्पादन नहीं किया था, समय =
real 0m0.577s
user 0m0.468s
sys 0m0.078s
एक ट्वीक इसके साथ ही अंतिम अवांछनीय }
दूर करने के लिए:
$ 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'
उम्मीद गया उत्पादन, समय =
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
तुम एक स्ट्रीमिंग फैशन में अपनी फ़ाइल पर कार्रवाई करने के 'jq' उपयोग करने पर विचार कर सकते हैं। – chepner