LinuxQuestions.org
Share your knowledge at the LQ Wiki.
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices


Reply
  Search this Thread
Old 12-15-2010, 07:53 AM   #1
Thaidog
Member
 
Registered: Sep 2002
Location: Hilton Head, SC
Distribution: Gentoo
Posts: 637

Rep: Reputation: 32
Need a script to break a block of text on to different lines.


I have a clump of text that needs to be broke up:

gdbm Sat 07 Feb 2009 03:28:18 AM EST libattr Sat 07 Feb 2009 03:28:18 AM EST db4 Sat 07 Feb 2009 03:28:19 AM EST mktemp Sat 07 Feb 2009 03:28:19 AM EST keyutils Sat 07 Feb 2009 03:28:20 AM EST pcre Sat 07 Feb 2009 03:28:21 AM EST setserial Sat 07 Feb 2009 03:28:24 AM EST zlib Sat 07 Feb 2009 03:28:24 AM EST gawk Sat 07 Feb 2009 03:28:25 AM EST readline Sat 07 Feb 2009 03:28:26 AM EST rhpl Sat 07 Feb 2009 03:28:28 AM EST cracklib-dicts Sat 07 Feb 2009 03:28:37 AM EST setools Sat 07 Feb 2009 03:28:37 AM EST hal Sat 07 Feb 2009 03:28:38 AM EST which Sat 07 Feb 2009 03:28:39 AM EST

Is there a way to get everything after the EDT in the text to be moved to a new line?
 
Old 12-15-2010, 07:57 AM   #2
druuna
LQ Veteran
 
Registered: Sep 2003
Posts: 10,532
Blog Entries: 7

Rep: Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405
Hi,

I'm guessing EDT is a typo and should be EST.

Quote:
sed 's/EST /EST\n/g' infile
Example output:
Code:
$ sed 's/EST /EST\n/g' infile 
gdbm Sat 07 Feb 2009 03:28:18 AM EST
libattr Sat 07 Feb 2009 03:28:18 AM EST
db4 Sat 07 Feb 2009 03:28:19 AM EST
mktemp Sat 07 Feb 2009 03:28:19 AM EST
keyutils Sat 07 Feb 2009 03:28:20 AM EST
pcre Sat 07 Feb 2009 03:28:21 AM EST
setserial Sat 07 Feb 2009 03:28:24 AM EST
zlib Sat 07 Feb 2009 03:28:24 AM EST
gawk Sat 07 Feb 2009 03:28:25 AM EST
readline Sat 07 Feb 2009 03:28:26 AM EST
rhpl Sat 07 Feb 2009 03:28:28 AM EST
cracklib-dicts Sat 07 Feb 2009 03:28:37 AM EST
setools Sat 07 Feb 2009 03:28:37 AM EST
hal Sat 07 Feb 2009 03:28:38 AM EST
which Sat 07 Feb 2009 03:28:39 AM EST
Hope this helps
 
Old 12-15-2010, 07:58 AM   #3
GrapefruiTgirl
LQ Guru
 
Registered: Dec 2006
Location: underground
Distribution: Slackware64
Posts: 7,594

Rep: Reputation: 556Reputation: 556Reputation: 556Reputation: 556Reputation: 556Reputation: 556
If you echo that chunk of text into sed, and use sed to change "EDT" to "EDT\n" (to insert a newline after each EDT) it then looks like this:
Code:
gdbm Sat 07 Feb 2009 03:28:18 AM EST
libattr Sat 07 Feb 2009 03:28:18 AM EST
db4 Sat 07 Feb 2009 03:28:19 AM EST
mktemp Sat 07 Feb 2009 03:28:19 AM EST
keyutils Sat 07 Feb 2009 03:28:20 AM EST
pcre Sat 07 Feb 2009 03:28:21 AM EST
setserial Sat 07 Feb 2009 03:28:24 AM EST
zlib Sat 07 Feb 2009 03:28:24 AM EST
gawk Sat 07 Feb 2009 03:28:25 AM EST
readline Sat 07 Feb 2009 03:28:26 AM EST
rhpl Sat 07 Feb 2009 03:28:28 AM EST
cracklib-dicts Sat 07 Feb 2009 03:28:37 AM EST
setools Sat 07 Feb 2009 03:28:37 AM EST
hal Sat 07 Feb 2009 03:28:38 AM EST
which Sat 07 Feb 2009 03:28:39 AM EST
Note that I used "EST" rather than "EDT", since I see no instances of "EDT" in the input.

I did exactly this:
Code:
echo "all that text" | sed 's/EST /EST\n/g'
 
Old 12-15-2010, 07:59 AM   #4
GrapefruiTgirl
LQ Guru
 
Registered: Dec 2006
Location: underground
Distribution: Slackware64
Posts: 7,594

Rep: Reputation: 556Reputation: 556Reputation: 556Reputation: 556Reputation: 556Reputation: 556
@ Druuna - nice one, I like that method!
 
Old 12-15-2010, 08:15 AM   #5
grail
LQ Guru
 
Registered: Sep 2009
Location: Perth
Distribution: Manjaro
Posts: 10,005

Rep: Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191
Well I think the sed is easier, but:
Code:
awk 'BEGIN{FS="EST ";OFS="EST\n"}$1=$1' file
 
Old 12-15-2010, 08:33 AM   #6
Thaidog
Member
 
Registered: Sep 2002
Location: Hilton Head, SC
Distribution: Gentoo
Posts: 637

Original Poster
Rep: Reputation: 32
Thanks I used:
sed 's/EDT /EDT\n/g' server.txt >> newfile.txt

and that worked with one problem... every incomplete string that was broke to a second line in the first file breaks to a second line in the new file... for instance:

[root@server tyler2]# head server.txt.bak
bgcc Tue 07 Apr 2009 09:24:38 AM EDT setup Tue 07 Apr 2009 09:24:39 AM EDT
audit-libs Tue 07 Apr 2009 09:24:47 AM EDT e2fsprogs Tue 07 Apr 2009 09:24:48
AM EDT expat Tue 07 Apr 2009 09:24:48 AM EDT keyutils-libs Tue 07 Apr 2009
09:24:48 AM EDT libselinux Tue 07 Apr 2009 09:24:48 AM EDT libstdc++ Tue 07
Apr 2009 09:24:49 AM EDT mingetty Tue 07 Apr 2009 09:24:49 AM EDT iproute Tue
07 Apr 2009 09:24:49 AM EDT net-tools Tue 07 Apr 2009 09:24:51 AM EDT psmisc
Tue 07 Apr 2009 09:24:53 AM EDT sysfsutils Tue 07 Apr 2009 09:24:54 AM EDT
file Tue 07 Apr 2009 09:24:54 AM EDT perl-Filter Tue 07 Apr 2009 09:24:56 AM
EDT python Tue 07 Apr 2009 09:24:58 AM EDT rpmdb-CentOS Tue 07 Apr 2009
09:25:03 AM EDT dbus-glib Tue 07 Apr 2009 09:25:04 AM EDT tar Tue 07 Apr 2009

Now looks like:

[root@server tyler2]# head server.txt
bgcc Tue 07 Apr 2009 09:24:38 AM EDT
setup Tue 07 Apr 2009 09:24:39 AM EDT
audit-libs Tue 07 Apr 2009 09:24:47 AM EDT
e2fsprogs Tue 07 Apr 2009 09:24:48
AM EDT
expat Tue 07 Apr 2009 09:24:48 AM EDT
keyutils-libs Tue 07 Apr 2009
09:24:48 AM EDT
libselinux Tue 07 Apr 2009 09:24:48 AM EDT


Instead of:

[root@server tyler2]# head server.txt
bgcc Tue 07 Apr 2009 09:24:38 AM EDT
setup Tue 07 Apr 2009 09:24:39 AM EDT
audit-libs Tue 07 Apr 2009 09:24:47 AM EDT
e2fsprogs Tue 07 Apr 2009 09:24:48 AM EDT
expat Tue 07 Apr 2009 09:24:48 AM EDT
keyutils-libs Tue 07 Apr 2009 09:24:48 AM EDT
libselinux Tue 07 Apr 2009 09:24:48 AM EDT

Any way to fix that?

Last edited by Thaidog; 12-15-2010 at 08:36 AM.
 
Old 12-15-2010, 08:45 AM   #7
chickenjoy
Member
 
Registered: Apr 2007
Distribution: centos,rhel, solaris
Posts: 239

Rep: Reputation: 30
I'm not good in sed but what if you first issue a command to convert them all into just one gigantic line. Then run the original sed command.

btw I don't know how to do the first part as well
 
Old 12-15-2010, 08:48 AM   #8
markush
Senior Member
 
Registered: Apr 2007
Location: Germany
Distribution: Slackware
Posts: 3,979

Rep: Reputation: Disabled
Well, you must not save the textfile with newlines. That means the text must be one single line. I don't know which editor you're using, but you should take "autowrap" off.

Markus
 
Old 12-15-2010, 08:59 AM   #9
colucix
LQ Guru
 
Registered: Sep 2003
Location: Bologna
Distribution: CentOS 6.5 OpenSuSE 12.3
Posts: 10,509

Rep: Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983
Code:
awk '{sub(/$/," "); gsub(/EDT */,"EDT\n"); printf "%s",$0}' file
 
Old 12-15-2010, 09:26 AM   #10
druuna
LQ Veteran
 
Registered: Sep 2003
Posts: 10,532
Blog Entries: 7

Rep: Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405
Hi,

Although I would prefer colucix' solution, here's another option:

Quote:
echo $(cat infile) | sed 's/EST /EST\n/g'

Last edited by druuna; 12-15-2010 at 09:27 AM.
 
Old 12-15-2010, 10:00 AM   #11
grail
LQ Guru
 
Registered: Sep 2009
Location: Perth
Distribution: Manjaro
Posts: 10,005

Rep: Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191
And just cause its fun:
Code:
awk 'BEGIN{RS="EDT *";ORS=" EDT\n"}$1=$1' file
 
Old 12-16-2010, 05:04 PM   #12
Thaidog
Member
 
Registered: Sep 2002
Location: Hilton Head, SC
Distribution: Gentoo
Posts: 637

Original Poster
Rep: Reputation: 32
Quote:
Originally Posted by colucix View Post
Code:
awk '{sub(/$/," "); gsub(/EDT */,"EDT\n"); printf "%s",$0}' file

Thanks guys! I ended up using this one. The original problem was that I had a script to get patch info off of several servers:

Code:
#!/bin/ksh
for SERVER in `cat server.lst`
do
ssh -n -o Batchmode=yes -o ConnectTimeout=30 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $SERVER "rpm -qa --qf %{NAME}"\t"%{INSTALLTIME:date}"\n" > /tmp/patch.out;cat /tmp/patch.out | mail -s $SERVER thaidogl@email.com"
done
But this returned ti garbbeled output you saw for each email. I was thinking it might be good to add in the awk statement somehow but some servers are reporting in EST and others in EDT so I guess I would have to throw an if statement in there somewhere which could get a little complex. Still maybe a good idea for a ton of servers...
 
Old 12-17-2010, 03:30 AM   #13
druuna
LQ Veteran
 
Registered: Sep 2003
Posts: 10,532
Blog Entries: 7

Rep: Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405Reputation: 2405
Hi,

An if statement isn't needed to tackle the EDT / EST problem. Both can be checked and replaced by one statement.

Using the solution I gave in post #10 as starting point, it will now look like this:
Code:
echo $(cat infile) | sed 's/\(E[DS]T \)/\1\n/g'
The sed statement will now look for EST or EDT and replace accordingly (using back-referencing). Example run based on the data you provided in post #6 (some EDT's are changed to EST):
Code:
$ cat infile
bgcc Tue 07 Apr 2009 09:24:38 AM EDT setup Tue 07 Apr 2009 09:24:39 AM EDT
audit-libs Tue 07 Apr 2009 09:24:47 AM EST e2fsprogs Tue 07 Apr 2009 09:24:48
AM EDT expat Tue 07 Apr 2009 09:24:48 AM EDT keyutils-libs Tue 07 Apr 2009
09:24:48 AM EST libselinux Tue 07 Apr 2009 09:24:48 AM EDT libstdc++ Tue 07
Apr 2009 09:24:49 AM EDT mingetty Tue 07 Apr 2009 09:24:49 AM EST iproute Tue
07 Apr 2009 09:24:49 AM EDT net-tools Tue 07 Apr 2009 09:24:51 AM EDT psmisc
Tue 07 Apr 2009 09:24:53 AM EDT sysfsutils Tue 07 Apr 2009 09:24:54 AM EST
file Tue 07 Apr 2009 09:24:54 AM EDT perl-Filter Tue 07 Apr 2009 09:24:56 AM
EDT python Tue 07 Apr 2009 09:24:58 AM EST rpmdb-CentOS Tue 07 Apr 2009
09:25:03 AM EDT dbus-glib Tue 07 Apr 2009 09:25:04 AM EST tar Tue 07 Apr 2009

$ echo $(cat infile) | sed 's/\(E[DS]T \)/\1\n/g'
bgcc Tue 07 Apr 2009 09:24:38 AM EDT 
setup Tue 07 Apr 2009 09:24:39 AM EDT 
audit-libs Tue 07 Apr 2009 09:24:47 AM EST 
e2fsprogs Tue 07 Apr 2009 09:24:48 AM EDT 
expat Tue 07 Apr 2009 09:24:48 AM EDT 
keyutils-libs Tue 07 Apr 2009 09:24:48 AM EST 
libselinux Tue 07 Apr 2009 09:24:48 AM EDT 
libstdc++ Tue 07 Apr 2009 09:24:49 AM EDT 
mingetty Tue 07 Apr 2009 09:24:49 AM EST 
iproute Tue 07 Apr 2009 09:24:49 AM EDT 
net-tools Tue 07 Apr 2009 09:24:51 AM EDT 
psmisc Tue 07 Apr 2009 09:24:53 AM EDT 
sysfsutils Tue 07 Apr 2009 09:24:54 AM EST 
file Tue 07 Apr 2009 09:24:54 AM EDT 
perl-Filter Tue 07 Apr 2009 09:24:56 AM EDT 
python Tue 07 Apr 2009 09:24:58 AM EST 
rpmdb-CentOS Tue 07 Apr 2009 09:25:03 AM EDT 
dbus-glib Tue 07 Apr 2009 09:25:04 AM EST 
tar Tue 07 Apr 2009
Hope this helps.
 
Old 12-17-2010, 04:46 AM   #14
grail
LQ Guru
 
Registered: Sep 2009
Location: Perth
Distribution: Manjaro
Posts: 10,005

Rep: Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191Reputation: 3191
Ditto with awk:
Code:
awk 'BEGIN{RS="E[DS]T *"}{ORS=" "RT"\n"}$1=$1' file
 
  


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
how to loop over text file lines within bash script for loop? johnpaulodonnell Linux - Newbie 9 07-28-2015 03:49 PM
Shell script to read lines in a text file and filter user data srimal Linux - Newbie 5 10-21-2009 07:41 AM
Extract lines NOT on a block of text from a file Renan_S2 Programming 3 10-05-2008 04:14 PM
shelll script to replace and add lines in text cmontr Programming 11 02-29-2008 07:27 AM
bash script that can read lines of text palceksmuk Programming 1 12-25-2005 03:49 AM

LinuxQuestions.org > Forums > Non-*NIX Forums > Programming

All times are GMT -5. The time now is 05:56 AM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration