Question

I have a text file containing some records. Each record is splitted in 4 rows (not always 4), like the example:

----
row1
row2
row3
row4
----
row1
etc...

Each row is ended with the Line Feed character (LF). Ok, I need to obtain the record in only one line, replacing the LF character with a Space, like in example:

---- row1 row2 row3 row4
---- row1 row2 ...etcetera

Any help or suggestion for the solution? Thanks in advance.

Was it helpful?

Solution

maybe this can work ?

cat FILE | xargs | sed "s/ ---- /\n---- /g"

OTHER TIPS

tr  "\n" " "  <file | awk '{gsub(/--+/,"\n&");print}'

or all in one awk

awk '/--/{print s;printf $0;s=""}!/--/{s=s" "$0}END{print s}' file

And a much simpler approach would be this

cat text_file | tr '\n' ' ' | sed 's/ ---/\n---/g'

You need to know what exactly is the separator between the records. In your example it looks like it's '----', but you also said that there is a variable number of records.

Anyway, things like that are best done using code like this:

cat source | (
  acc=""
  while read -r line; do
  if test "$line" = "----" -a -n "$acc"; then
    echo "$acc"
    acc="$line"
  else
    test -n "$acc" && { acc="$acc "; }
    acc="${acc}$line"
  fi
  done
  test -n "$acc" && { echo "$acc"; }
)

awk 'BEGIN {RS="----"; FS="\n"; OFS=" "} FNR==1 {next} {$1=RS $1; print}' input.file

Use awk for this rather than a shell script

Iterating through a text file and doing different things based on the line contents, is precisely what awk was designed to do.

In the 21st century shell scripts should be kept simple and other tools used for complex logic.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top