concatenate lines using shell scripting


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting concatenate lines using shell scripting
# 8  
Old 09-06-2009
geeez, why it doesn't work on my file.

awk '/=/{$0="\n"}1' ORS="" $DSTDIR/ttt > $DSTDIR/ttt2

both ttt, ttt2 are still the same. what did i do wrong?

---------- Post updated at 01:51 PM ---------- Previous update was at 01:46 PM ----------

it doesn't do the trick for me. it duplicates para after para...

not concatnate those lines.

Quote:
Originally Posted by bakunin
in sed it is easy: we have two types of lines, the ones reading "=" and the others. When we encounter a "="-line, we want to print out what we have so far, minus the newlines. If we encounter one of the other lines we want to store its contents until we encounter a "="-line.

sed has a so-called "hold space", think of it as a variable, where you can store things until you need them. We append everything to this hold space until we encounter a "="-line, then we recall the hold space, filter out all embedded newlines and print it, then start over.

In the following script i have put in comment for your understanding, remove them, because sed doesn't allow inline commenting in scripts. Furthermore, you can put the whole script on one line, replacing linefeeds with semicolons:

Code:
sed -n '/^=/ {                   # if a line starts with "="
          s/.*//                 # delete this lines content
          x                      # exchange the pattern space (empty) and the hold space
          s/\n//g                # delete newlines
          p                      # then print what you have
     }
     /^=/ ! {                    # if a line doesn't start with "="
          H                      # append it to the hold space
     }' /your/file > newfile

for short:

Code:
sed -n '/^=/{s/.*//;x;s/\n//gp};/^=/!{H}' /your/file > newfile

I hope this helps.

bakunin
# 9  
Old 09-06-2009
I just noticed that in your example text the trailing commata were also stripped off. To achieve this i would like to add a line to my script, the purpose should be evident:

Code:
sed -n '/^=/ {                   # if a line starts with "="
          s/.*//                 # delete this lines content
          x                      # exchange the pattern space (empty) and the hold space
          s/\n//g                # delete newlines
          s/[,;]$//
          p                      # then print what you have
     }
     /^=/ ! {                    # if a line doesn't start with "="
          H                      # append it to the hold space
     }' /your/file > newfile

I hope this helps.

bakunin
# 10  
Old 09-06-2009
i guess i have some problem with file on unix/windows. i have to go out now. will check later when i come back. so far, no good.

thanks for all ur help

---------- Post updated at 10:32 PM ---------- Previous update was at 02:57 PM ----------

it's so freaking me out right now.

only protocomm's solution partially work. that means i can see it worked in window's word, but not on note pad. when i open the output file in liunx server, it's not working like note pad.

i have no idea what's happening. any suggestions?

thanks all
# 11  
Old 09-07-2009
Quote:
Originally Posted by dtdt
i have no idea what's happening. any suggestions?
Since you don't show us any real example of what your file looks like we are left to guesses. Therefore the following is again - a guess (btw.: my code worked perfectly on AIX, Solaris and Ubuntu Linux - more Unix/Linux dialects i don't have at hand but probably nothing will change the result).

Files are different in Windows/DOS and UNIX. The reason is that newlines are encoded differently. In UNIX dialects a newline is encoded in a single character, a "^M" (control-m), the linefeed character. In DOS/Windows a newline is encoded in two characters, a CR (carriage return) and a LF (line feed).

Create a file under UNIX (issue "cat > unixfile", then start typing, press "control-D" to end the input) and get a file created under Windows. Now issue "od -ax dosfile | more" and "od -ax unixfile | more" in two windows and observe the difference.

If this is the case with your file try "ASCII mode" when you are transferring it via ftp from DOS to UNIX and vice versa. The ASCII mode (instead of "binary" mode, which is default) takes care of exactly this thing.

I hope this helps.

bakunin
# 12  
Old 09-07-2009
would you please PM your email? I'd like to set you the file as attachment. this is the first time i met this and i completely lost.
# 13  
Old 09-07-2009
Quote:
Originally Posted by dtdt
i have a mega file in this format:

a,
b,
c,
d,
=
a2,
b2,
c2,
d2,
=
a3,
b3
=

i want to combine lines until = meet. the result should be :
a,b,c,d,
a2,b2,c3,d2
a3,b3
...
One way to do it in Perl:

Code:
$ 
$ cat f2
a,
b,
c,
d,
=
a2,
b2,
c2,
d2,
=
a3,
b3
=
$ 
$ perl -ne 'chomp; $x.=$_; END{$x=~s/[,]*=/\n/g; print $x}' f2
a,b,c,d
a2,b2,c2,d2
a3,b3
$ 
$

If you use vi or vim to open your file in Unix/Linux and see "^M" characters at the end of each line, then that could be one of your problems.

tyler_durden
# 14  
Old 09-07-2009
thanks all. the f* problem is the format with the file. it's really strange, i got the file after parsing a web page. i used the program hundreds of times, and this is the first time i have this issue. after i run a dos2unix convert, all works! thanks a lot.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Delete all CONSECUTIVE text lines from file shell scripting

Hi I have a text file like below. THe content of the text will vary. Entire text file have four consecutive lines followed with blank line. I want to delete the occurrence of the two consicutive lines in the text file. I don't have pattern to match and delete. Just i need to delete all... (5 Replies)
Discussion started by: RJSKR28
5 Replies

2. UNIX for Dummies Questions & Answers

Concatenate three lines into one

Hi. I'm new to this forum. I am attempting to parse an Audit Log from Cognos/TM1, selecting only Event IDs of "client" which are found on the "start-tag" record. These Logs are in a pseudo-XML format but not a true XML format. I want to FTP an Audit Log File from the Cognos server to our UNIX... (7 Replies)
Discussion started by: FredAtArrow
7 Replies

3. UNIX for Dummies Questions & Answers

Shell script to read lines in a text file and filter user data Shell Programming and Scripting

sxsaaas (3 Replies)
Discussion started by: VikrantD
3 Replies

4. UNIX for Advanced & Expert Users

Concatenate lines in file shell script

Hi colleagues, I have a file in this format. "/cccc/pppp/dddd/ggg/prueba.txt". ERROR" THE error bbbbbbbbbb finish rows. "/kkkk/mmmm/hhhh/jjj/ejemplo.txt". ERROR This is other error rows.I need my file in this format. "/cccc/pppp/dddd/ggg/prueba.txt". ERROR" THE error bbbbbbbbbb finish rows.... (3 Replies)
Discussion started by: systemoper
3 Replies

5. Programming

Concatenate two lines in a fIle

Hi All, Can any one help me in finding the solution for concatenating two or more lines in a file and writing them to a temporary file. for Example: He is a wise student. So he got first rank. This is in a file i want the output as He is a wise student so he got first rank. into a file... (3 Replies)
Discussion started by: uday.sena.m
3 Replies

6. Shell Programming and Scripting

searching multiple lines and replacing in shell scripting

Hi, I have a file with below contents, ssenthil = rw anilkg = rw I want to search for "ssenthil" and need to delete line 1 and 2 , if the third line starts with "" respectively and blank line immediately and third line starts with " anilkg = rw Please help me . Great day... (5 Replies)
Discussion started by: anil8103
5 Replies

7. Shell Programming and Scripting

Concatenate lines between lines starting with a specific pattern

Hi, I have a file such as: --- >contig00001 length=35524 numreads=2944 gACGCCGCGCGCCGCGGCCAGGGCTGGCCCA CAGGCCGCGCGGCGTCGGCTGGCTGAG >contig00002 length=4242 numreads=43423 ATGCCGAAGGTCCGCCTGGGGCTGG CGCCGGGAGCATGTAGCG --- I would like to concatenate the lines not starting with ">"... (9 Replies)
Discussion started by: s052866
9 Replies

8. Shell Programming and Scripting

concatenate lines in pairs

Hi, I have a text file with the following contents /C=IT/O=INFN/OU=Personal Certificate/L=Napoli/CN=Some guy /C=IT/O=INFN/CN=INFN CA /O=Grid/O=NorduGrid/OU=uninett.no/CN=Another guy /O=Grid/O=NorduGrid/CN=NorduGrid Certification Authority /C=TW/O=AP/OU=GRID/CN=Someone else... (5 Replies)
Discussion started by: kerl
5 Replies

9. Shell Programming and Scripting

Concatenate two lines in one

Does anyone know a way I can fix my file below where it has lines that are cut? Just like the (notice the space before ms,c=PH).. dn: cn=english,ou=Messaging,ou=lang,o=subject,t=j ms,c=PH which should be dn: cn=english,ou=Messaging,ou=lang,o=subject,t=jms,c=PH The whole text file... (5 Replies)
Discussion started by: Orbix
5 Replies

10. UNIX Desktop Questions & Answers

How to concatenate consecutive lines

I have a few lines like -- feature 1, subfeat 0, type 3, subtype 1, value 0, -- feature 1, subfeat 0, type 1, subtype 1, value 0, I would like to concatenate the... (1 Reply)
Discussion started by: shivi707
1 Replies
Login or Register to Ask a Question