Formatting a text file

Hi All :),

I have a formatting question and I am unsure on how I should proceed with my bash shell script. I am unsure weather to use perl or simply edit it in bash. I prefer bash but I am only aware of the awk utility to extract parts of a file, not edit output.

Scenario:

I have a file that has within it text that looks like:

 Group Username,Username,Username,Username

I am trying to get it to be:

 group (,username,) (,username,) (,username,)

Any ideas on how I should proceed here?
this is also not case sensitive.

Thanks!
B

Try this, if you're happy with the result then use mv infile.fixed infile to overwrite the original with the updated version.

awk 'NF==2 {
   printf "%s ", tolower($1)
   cnt=split(tolower($2),users,",");
   for(u=1;u<=cnt;u++) printf " (,%s,)", users
   printf "\n"
}' infile > infile.fixed

Or this using bash script:

#!/bin/bash

while read group users
do
   printf "$group"
   ( IFS=,
     for user in $users
     do
       printf " (,$user,)"
     done
   )
   printf "\n"
done < infile > infile.fixed

Hello bstrizzy,

Following may also help you in same.

awk -F" |," '{for(i=1;i<=NF;i++){X=i>1?X OFS s1 tolower($i) s2:tolower($i)}} END{print X}' s1="(," s2=",)"  Input_file

Output will be as follows.

group (,username,) (,username,) (,username,) (,username,)

Thanks,
R. Singh

Wow. Thanks to Chubler_XL :smiley: and RavinderSingh13 :D. All of the solutions worked perfectly.

In order to understand this further and practice with 'awk' do you guys recommend any websites/videos/books for tutorials and practice?

Bryan S:b:

---------- Post updated at 07:19 PM ---------- Previous update was at 04:23 PM ----------

Chubler_XL I am testing this code and Can you please add documentation to this code?

I am trying to make sense of this and I can only make out:

Line 1 : initiating the awk command and setting the Number of Fields to 2, Why is this being done?

Line 2: We are printing everything in the first field to lowercase but I am unsure what the "%s" represents

Line 3: creating the variable count and setting it equal to splitting what is in field 2 and using the "," as a delimiter. What does the ",users," represent?

Line 4: creating a for loop with random variable 'u' starts at 1 it continues until it has hit the entire count of the second field and 'u' is set to increase 1 everytime. each time it goes through this loop it will print "(,%s,)",users[u]?

Line 5: prints a new line

Line 6: using infile and sending output to infile.fixed

Can you help me fill in my blanks?

Thanks!
B

Start with the awk man page. (Use the command: man awk to get the awk man page on your system.)

If it was setting the number of fields, it would be using = instead of == . This is a test that selects input lines that contain two fields. If the test evaluates to TRUE, the commands between { and the matching } will be executed for this input line. So, in this case all of the commands in this script are executed in order for every line that has two input fields and all other lines are ignored.

Look at the awk or printf man page for a description of format specifiers in the format string argument to the printf function. In this case, %s prints a string specified by the next argument and then prints a space following that.

Unquoted commas separate arguments in any function call. Look at the awk man page. The 1st argument to split tells it what string is to be split; the 2nd argument specifies the name of an array that is to contain the fields that are split out of the 1st argument; and the 3rd argument, if there is one, specifies the extended regular expression that is used to identify the field separators.

Again, look at the awk or printf man page to see how the printf function format string argument works. Do not ignore the space in that format argument. As you requested, this loop prints each array element split from the 2nd field on the current input line preceded by a space and the characters (, and followed by ,) .

I would say "reading from" instead of "using", but you get the idea.

2 Likes

awesome. sounds like man pages will be my best friend. this was very helpful!