Abnormality while piping tr command output to sed


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Abnormality while piping tr command output to sed
# 1  
Old 12-19-2012
Abnormality while piping tr command output to sed

i have a file seperated each line seperated by newline. For example
Code:
alpha
beta
gamma

i am trying to replace the newlines to "," but dont want , present at the end of the line so i am trying the below one liner . but not sure whats wrong but its not working
cat myfile | tr -s '\n' ',' | sed 's/,$//'

But when i try it this way , its working
echo "alpha,beta,gamma," | sed 's/,$//'

can someone please explain me this behaviour.
# 2  
Old 12-19-2012
Based exactly on your input file, it works for me. What is not working about it for you?

Code:
$ tr -s '\n' ',' < file | sed 's/,$//'    
alpha,beta,gamma

(no need for cat, though)

You can also use paste
Code:
$ paste -sd, file                     
alpha,beta,gamma

At a wild guess, I would say your file has ^M characters in it.

Show the output of:
Code:
cat -v infile

This User Gave Thanks to Scott For This Post:
# 3  
Old 12-19-2012
I would suggest your input file has some non-printing characters in it, most likley it's a DOS formatted file. Try running dos2unix on the file first or use:

Code:
tr -s '\r\n' ',' < myfile | sed 's/,$//'

# 4  
Old 12-19-2012
In addition to the possibilities already listed, note that the standards only define the behavior of sed when the input is a text file. The output from the tr command is not a text file (by definition, the last character of a text file that is not an empty file is a <newline> character). The tr command you gave strips off the trailing <newline>; the echo command you gave supplies a trailing <newline>. If this is the problem, the tr|awk pipeline may work as you expect on some systems and produce no output at all (or do something completely different) on other systems.

Here are a couple of portable ways to do this:
Code:
awk 'NR==1{o = $0; next}
        {o = o "," $0}
END     {print o}' myfile

and:
Code:
#!/bin/ksh
(read o
while IFS="" read x
do      o="$o,$x"
done
printf "%s\n" "$o"
) < myfile

I use the Korn shell, but you can replace /bin/ksh in #!/bin/ksh with a path to any POSIX conforming shell on your system.

Last edited by Don Cragun; 12-21-2012 at 04:48 AM.. Reason: fixed typo
This User Gave Thanks to Don Cragun For This Post:
# 5  
Old 12-19-2012
I have the file in unix system only and i dont see any any extra character. I am using solaris 10 .
Code:
# cat myfile
alpha
beta
gamma

# od -c myfile
0000000   a   l   p   h   a  \n   b   e   t   a  \n   g   a   m   m   a
0000020  \n
0000021
#

Code:
# tr -s '\n' ',' < myfile | sed 's/,$//'
#

I have tried this with bourne and bash shell. not same result.

sed path : /bin/sed

I tried with xpg4 path and output looks promising but with a warning message

Code:
# tr -s '\n' ',' < myfile | /usr/xpg4/bin/sed 's/,$//'
sed: Missing newline at end of file standard input.
alpha,beta,gamma

---------- Post updated at 03:16 PM ---------- Previous update was at 03:10 PM ----------

@Don Cragun your code worked. I am not able to get the point on why this behaviour is seen. why does a strip of trailing newlines piped to sed/awk wont work ?
# 6  
Old 12-19-2012
Quote:
Originally Posted by chidori
I have the file in unix system only and i dont see any any extra character. I am using solaris 10 .
Code:
# cat myfile
alpha
beta
gamma

# od -c myfile
0000000   a   l   p   h   a  \n   b   e   t   a  \n   g   a   m   m   a
0000020  \n
0000021
#

Code:
# tr -s '\n' ',' < myfile | sed 's/,$//'
#

I have tried this with bourne and bash shell. not same result.

sed path : /bin/sed

I tried with xpg4 path and output looks promising but with a warning message

Code:
# tr -s '\n' ',' < myfile | /usr/xpg4/bin/sed 's/,$//'
sed: Missing newline at end of file standard input.
alpha,beta,gamma

---------- Post updated at 03:16 PM ---------- Previous update was at 03:10 PM ----------

@Don Cragun your code worked. I am not able to get the point on why this behaviour is seen. why does a strip of trailing newlines piped to sed/awk wont work ?
The sed and awk utilities are only defined to work on text files. If the last line fed to sed or awk does not end in a <newline> character, the results are unspecified. Basically, sed and awk try to read in a line, and until they find the terminating <newline> character they don't have a line; so the partial line at the end of the file may be ignored as Solaris 10's /usr/bin/sed did. Or as Solaris 10's /usr/xpg4/bin/sed did; it can add the newline for you and warn you that it did so. Some versions of sed will silently add the trailing <newline> without a warning. Which behavior is better depends on the source of your data. (If your data source dies in the middle of transmitting/producing your data, the warning lets you know that data from the end of your input stream may have been lost.)
# 7  
Old 12-19-2012
ok , so sed/awk have not worked in here as
tr output : alpha,beta,gamma, did not contain a new line in them. And this behaviour is also sed/awk version specific.
now with awk we can change the record seperator right ? so should not something like this work logically ?
since my tr output does not have a newline i am using RS=""
Code:
# tr -s '\n' ',' < myfile | awk 'BEGIN{RS=""}{sub(/,$/,"");print}'

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Facing abnormality in Find command

Whenever the below command is being executed by a scheduler at UNIX environment, we are getting below error cd /tmp/log find . -ignore_readdir_race ! -name . -prune -iname 'XYZ*' -type f -mtime +4 -printf "%f\n" ./tmpfile.script_name.2.31885.201906071336.tmp': No such file or directory... (2 Replies)
Discussion started by: Anirban2208
2 Replies

2. Shell Programming and Scripting

Piping output of ls to a text file

Basically I was wondering if any of you know how to pipe the output of ls to a text file? so in my shell script one of the lines is ls but i want to pipe it into a file called directory listing. Cheers. I have tried ls | Directorylisting.txt but it keeps saying " line 7: DirectoryListing.txt:... (9 Replies)
Discussion started by: LinuxNubBrah
9 Replies

3. Shell Programming and Scripting

need help piping the output from an app... uh, yeah...

Ok, so there is a perl script that runs as a server, on my local host. It tells me which port to use. I want to pipe that output into my browser so I can do the whole thing with a single command. The problem is, I think, that the program doesn't actually exit cause it's running a server, so...... (6 Replies)
Discussion started by: ninjaaron
6 Replies

4. Shell Programming and Scripting

Piping output from a command into bash script

Hi all. I am using procmail to deliver an email to a script I am developing. Procmail delivers the email to the script on standard input. I imagine this is the same as piping input from a command into the script. Hence I've been testing my script by running echo 'test' | sms-autosend-backup.sh ... (2 Replies)
Discussion started by: akindo
2 Replies

5. Shell Programming and Scripting

Piping and assigning output to a variable in Perl

Hi All, I am trying to convert the below Csh code into Perl. But i have the following error. Can any expert help ? Error: ls: *tac: No such file or directory Csh set $ST_file = `ls -rt *$testid*st*|tail -1`; Perl my $ST_file = `ls -rt *$testid*st*|tail -1`; (10 Replies)
Discussion started by: Raynon
10 Replies

6. Shell Programming and Scripting

piping oracle output to a file?

Hi All... Does anyone know how to pipe the output of a "select" statement from a call to Oracle to a file? ANy ideas woule be greatly appreciated! Code is as below... echo "producing CSV file 2..." sqlplus -s $username/$password@$database<<EOF set serveroutput on size 1000000 set... (13 Replies)
Discussion started by: satnamx
13 Replies

7. Shell Programming and Scripting

piping output of tail running in background

Not sure why this does not work in bash: tail -f err.log |& -bash: syntax error near unexpected token `&' I am attempting to continuously read a file that is being updated by doing a "tail -f" on the file and piping the output to stdin which can then be read by the next shell command Thnx (4 Replies)
Discussion started by: anuramdas
4 Replies

8. Shell Programming and Scripting

piping output to echo

Hi, I was wondering why ls * | echo does not print the contents of the directory to the screen? The way I see it, ls * returns a whole lot of information, and then we pipe all this info to echo, so surely it should all come to our screen! Is there a serious flaw in my understanding? ... (3 Replies)
Discussion started by: A1977
3 Replies

9. UNIX for Dummies Questions & Answers

piping the output of find command to grep

Hi, I did not understand why the following did not work out as I expected: find . -name "pqp.txt" | grep -v "Permission" I thought I would be able to catch whichever paths containing my pqp.txt file without receiving the display of messages such as "find: cannot access... Permisson... (1 Reply)
Discussion started by: 435 Gavea
1 Replies

10. Shell Programming and Scripting

Piping output to while read

Hi. Im using cat to output the contents of a file, then piping it to my while read loop.In this loop variables get assigned values. However when i try to use the variables outside the loop their values has been reset.I understand about subshells etc. but I have no idea how to "preserve" the... (3 Replies)
Discussion started by: Ultimodiablo
3 Replies
Login or Register to Ask a Question