Re: printing words without newlines?

Ed Morton <[email protected]>
Newsgroups alt.comp.lang.awk,comp.lang.awk
Organization A noiseless patient Spider
Message-ID <[email protected]>
On 5/11/2024 11:57 PM, David Chmelik wrote:
> I'm learning more AWK basics and wrote function to read file, sort,
> print.  I use GNU AWK (gawk) and its sort but printing is harder to get
> working than anything... separate lines work, but when I use printf() or
> set ORS then use print (for words one line) all awk outputs (on FreeBSD
> UNIX 14 and Slackware GNU/Linux 15) is a space (and not even newline
> before shell prompt)... 

Your input file probably has DOS line endings, see 
https://stackoverflow.com/questions/45772525/why-does-my-tool-output-overwrite-itself-and-how-do-i-fix-it 
for what that means and how to deal with them but basically either run 
`dos2unix` on your file before calling awk or add `sub(\r$/,"")` as I 
show below*.

is this normal (and I made mistake?) or am I
> approaching it wrong?  I recall BASIC prints new lines, but as I learned
> basic C and some derivatives, I'm used to newlines only being specified...
> ------------------------------------------------------------------------
> # print_file_words.awk
> # pass filename to function
> BEGIN { print_file_words("data.txt"); }
> 
> # read two-column array from file and sort lines and print
> function print_file_words(file) {
> # set record separator then use print
> # ORS=" "

Move the above to a BEGIN section so it is executed once total instead 
of once per input line.

>    while(getline<file) arr[$1]=$0

The above would spin off into an infinite loop if getline failed since 
in that case it'd return a negative number which would still evaluate to 
"true" when tested as a condition. It needs to be:

     while ( (getline < file) > 0 ) arr[$1] = $0

See http://awk.freeshell.org/AllAboutGetline for that and more info on 
using getline.

*This is where you'd strip CRs from the end of input lines. Do either of 
these, the first uses a non-POSIX extension function gensub() (which 
gawk has), the second would work in any awk:

     a) while ( (getline < file) > 0 ) arr[$1] = gensub(/\r$/,"",1)

     b) while ( (getline < file) > 0 ) { sub(/\r$/,""); arr[$1] = $0 }


>    PROCINFO["sorted_in"]="@ind_num_asc"
>    for(i in arr)
>    {
>      split(arr[i],arr2)
>      # output all words or on one line with ORS
>      print arr2[2]
>      # output all words on one line without needing ORS
>      #printf("%s ",arr2[2])
>    }

Add `print RS` after the loop if you had set ORS to a blank so the 
output ends in a newline and therefore is a valid POSIX text file, 
otherwise YMMV with what subsequent text processing tools can do with it.

     Ed.

> }
> ------------------------------------------------------------------------
> # sample data.txt
> 2 your
> 1 all
> 3 base
> 5 belong
> 4 are
> 7 us
> 6 to
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.