У меня была точно такая же проблема. Затем, убив хром и запустив его снова, это исправилось, хахаха. Поскольку этому вопросу уже месяц, я полагаю, что у вас, вероятно, больше нет этой проблемы.
tot=`sed '/\/\//d' inputfile| sed '/^$/d'| awk 'END{print NR}'`
sed '/\/\//d' inputfile| sed '/^$/d' > finalfile
for ((i=1;i<=$tot;i++)); do z=$(($i + 4)); sed -n ''$i','$z'p' finalfile| perl -pne "s/\n/, /g"; i=$z;echo -e "\n"; done|sed '/^$/d'| awk '{gsub(",","",$NF);print $0}'| sed "s/:,/:/g"
выход
ABC, String1, String2, BDF: ssss
AFG, String4, String9, BDF: fff
С любым стандартным awk:
/^\/\//{ #If this line begins with //
sub(/:,/,":",line) #Substitute :, with :
if(line){print line} #If `line` is not blank, print it
line="" #Reset `line`
next #Start next cycle with next line
}
#If current line not empty, append it to `line` with separator if `line` not empty
!/^$/{line=(line?line", ":"")$0}
Сохраните приведенный выше скрипт (, например, какjoinlines.awk
)и запустите его во входном файле:
$ awk -f joinlines.awk file
ABC, String1, String2, BDF: ssss
AFG, String4, String9, BDF: fff
$ cat tst.awk
$0 == "//" {
if ( NR > 1 ) {
print rec
}
rec = sep = ""
next
}
NF { rec = rec (prevNF ? " " : sep) $0; sep=", " }
{ prevNF = NF }
$ awk -f tst.awk file
ABC, String1, String2, BDF: ssss
AFG, String4, String9, BDF: fff
С помощью редактора awk, основанного на текущей записи и логическом флаге f, мы манипулируем разделителем выходных записей.
awk '
! NF || /^\/\/$/ { f=""; next }
{
ORS = ! f && ! /:/ ? ", " \
: ! f && /:/ ? (f=" ") \
: RS
}1' file
В Perl мы работаем в режиме абзаца
perl -F'\n' -aln -00 -e '$"=", ";
m{\A//$}m and
print reverse pop @F, "@F[1..$#F] ";
' file
Использование интерпретатора Python 3
python3 -c 'import sys
with open(sys.argv[1]) as fh:
for line in fh:
line = line.rstrip("\n")
if line == "//": L = []
elif line != "": L += [line]
elif len(L):
print(", ".join(L[:-1])+" "+L[-1])
L = []
if len(L): print(", ".join(L[:-1])+" "+L[-1])
' file
Использование GNU sed
sed -e '
/\n/bb
/\/\//,/^$/!d
/./!ba
\|//|!H;$!d
:a;z;x;D
:b;s/:\n/: /;s/\n/, /g
' file
выход
ABC, String1, String2, BDF: ssss
AFG, String4, String9, BDF: ffff
попробуйте с GNU awk
, который позволяет установить RS на несколько символов и установить двойную косую черту //
; затем напечатайте поля с разделителями-запятыми, установив OFS=', '
и верните двоеточие -запятую в двоеточие с помощью gsub()
; цель установки $1=$1
состоит в том, чтобы запустить awk для перестроения полей на основе OFS, установленного затем print
.
awk -v RS='//' 'NF{ $1=$1; gsub(":,", ":"); print }' OFS=', ' infile