Tony
Tony

Reputation: 2929

Joining lines with awk and sed

I like to join lines following {st,corridor,tunnel} into one line using AWK or SED

Input 

abcd 
efgjk
st 
wer
dfgh
corridor 
weerr
tunnel 
twdf

Desired output


abcd  
efgjk st  
wer 
dfgh corridor  
weerr tunnel 
twdf

Upvotes: 2

Views: 931

Answers (4)

Steve
Steve

Reputation: 54592

One way using awk:

awk '!/st|corridor|tunnel/ { if (line) print line; line = $0; next } { line = line " " $0 } END { print line }' file.txt

Results:

abcd 
efgjk st 
wer
dfgh corridor 
weerr tunnel 
twdf

Upvotes: 2

slitvinov
slitvinov

Reputation: 5768

With awk

BEGIN {
    s["st"]=s["corridor"]=s["tunnel"]
}

$1 in s {
    print prev, $1
}

!($1 in s) {
    if (prev) print prev
    prev = $1
}

Upvotes: 1

Ray Toal
Ray Toal

Reputation: 88488

Or, an awk version that reads the whole file into memory first (not recommended for large files):

$ awk 'BEGIN {i=1} {line[i++] = $0} END {j=1; while (j<i) {if (match(line[j+1], /^(st|corridor|tunnel)$/)) {print line[j] " " line[j+1]; j+=2} else print line[j++];}}' streets
abcd
efgjk st
wer
dfgh corridor
weerr tunnel
twdf

I'll leave you with the exercise of doing this one-or-two-lines-at-a-time. :)

Upvotes: 1

potong
potong

Reputation: 58578

This might work for you (GNU sed):

sed '$!N;s/\n\(st\|corridor\|tunnel\)\s*$/ \1/;P;D' file

Upvotes: 1

Related Questions