Объединить строки между двойными косыми чертами

У меня была точно такая же проблема. Затем, убив хром и запустив его снова, это исправилось, хахаха. Поскольку этому вопросу уже месяц, я полагаю, что у вас, вероятно, больше нет этой проблемы.

2
21.06.2020, 16:43
5 ответов
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
0
18.03.2021, 23:26

С любым стандартным 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 
2
18.03.2021, 23:26
$ 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
2
18.03.2021, 23:26

С помощью редактора 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
0
18.03.2021, 23:26

попробуйте с GNU awk, который позволяет установить RS на несколько символов и установить двойную косую черту //; затем напечатайте поля с разделителями-запятыми, установив OFS=', 'и верните двоеточие -запятую в двоеточие с помощью gsub(); цель установки $1=$1состоит в том, чтобы запустить awk для перестроения полей на основе OFS, установленного затем print.

awk -v RS='//' 'NF{ $1=$1; gsub(":,", ":"); print }' OFS=', ' infile
4
18.03.2021, 23:26

Теги

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