Help with awk


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers Help with awk
# 1  
Old 02-04-2012
Help with awk

Hi, I'm trying to parse a file that looks like this to create an output file based on the first 3 characters
Code:
FL1ABC 
LEX123 
FL1DDD 
LEX888
LEXTHE 
FL1EEE 
FL1FFF 
LEX555

The file will need to have the LEX records appended to each of
the FL1 records above it like this:
Code:
FL1ABCLEX123 
FL1DDDLEX888
FL1DDDLEXTHE 
FL1EEE 
FL1FFFLEX555

Currently i am using
Code:
awk ' 
/^FL1/ { key[++k] = $0; print > "list"; next} 
/^LEX/ { lex[k]   = $0 } 
END    { for (i=1; i<=k; i++) print key[i] lex[i] } 
'  filename

This is giving me
Code:
FL1ABCLEX123 
FL1DDDLEXTHE 
FL1EEE 
FL1FFFLEX555

i.e FL1DDDLEX888 record is getting missed out. Thanks in advance for any help you could provide

Akshay

Last edited by Franklin52; 02-07-2012 at 08:54 AM.. Reason: Please use code tags for code and data samples, thank you
# 2  
Old 02-04-2012
Hi akshay01987,

One way:
Code:
$ cat infile
FL1ABC
LEX123
FL1DDD
LEX888
LEXTHE
FL1EEE
FL1FFF
LEX555 
$ cat script.awk
## When line begins with 'FL1' ...
$0 ~ /^FL1/ {
        ## If previous line also began with 'FL1', flag 'prev_fl1' will
        ## be active, so print it because its value will be overwritten.
        if ( prev_fl1 ) {
                print fl1
        }
        ## Save current 'FL1' register.
        fl1 = $0
        ## Set flag to indicate that last processed line began with 'FL1'
        prev_fl1 = 1
        ## Process next line.
        next
}

## For all other lines...
{
        ## Print previous value of 'FL1' register with current one appended.
        printf "%s%s\n", fl1, $0
        ## Unset variable.
        prev_fl1 = 0
}

END {
        if ( prev_fl1 ) {
                print fl1
        }
}

$ awk -f script.awk infile
FL1ABCLEX123
FL1DDDLEX888
FL1DDDLEXTHE
FL1EEE
FL1FFFLEX555

Regards,
Birei
This User Gave Thanks to birei For This Post:
# 3  
Old 02-05-2012
Thanks a lot bretei

But my requirement is that only LEX records must be appended to FL1 records. Rest all should be ignored and also if there are two or more LEX records they must be appended with previous FL1 record.

Input File
Code:
FL1ABC 
LEX123 
FL1DDD 
LEX888
LEXTHE 
XXX345
FL1EEE 
FL1FFF 
LEX555
RTY567


Then the output should be like
Code:
FL1ABCLEX123 
FL1DDDLEX888
FL1DDDLEXTHE 
FL1EEE 
FL1FFFLEX555


Last edited by Franklin52; 02-07-2012 at 08:55 AM.. Reason: Please use code tags for code and data samples, thank you
# 4  
Old 02-05-2012
Code:
nawk '/^FL1/{x=$0;printf (f?RS:z) x;f++}/^LEX/{print (f?z:x) $0;f=z}' yourfile

This User Gave Thanks to ctsgnb For This Post:
# 5  
Old 02-05-2012
HI ctsgnb

I really thank for the effort u have taken for this i would really appreciate if you could just explain to me wat the code does.

I m a novice in this awk arena Smilie
# 6  
Old 02-05-2012
/^FL1/if the scanned line begins with FL1...
{x=$0store the line in variable x
f?RS:zif f is true (f is not empty AND f is not equal to 0) then take the value of the Record Separator, whose default value is «newline » (character \n) otherwise take the value of z (which actually is just a variable that has not been set so that is empty)
(f?RS:z) xThis is the concatenation of the value taken by the previously described (...) expression with the content of variable x
printf (f?RS:z) xthis display the previously described concatenation but keep on the same line
f++}this is same as f=f+1 (i set the flag to mark that a new FL1 line has just be scanned & printed and that no corresponding LEX line have been printed so far)
/^LEX/if the scanned line start with LEX...
{print (f?z:x) $0if f flag is set we can just print the concatenation of z and $0 (z is actually a variable that has never been set so it is empty) otherwise we need to concatenate the last found FL1 line (which was sored in variable x) to our current LEX line ($0)
f=z}'if we are in LEX line, we must reset the f flag since at least 1 LEX line has been found for the last FL1 line.
---------- Post updated at 10:09 PM ---------- Previous update was at 09:56 PM ----------

You can enhance my code with :
Code:
nawk '/^FL1/{x=$0;printf (f?RS:z) x;f++}/^LEX/{print (f?z:x) $0;f=z}END{printf f?RS:z}' inputfile



Just to ensur that the last line is displayed properly
(in the previous version, if the last line was a FL1 line, a missing "newline" character needed to be displayed to have a better output
This User Gave Thanks to ctsgnb For This Post:
# 7  
Old 02-07-2012
Thanks a lot ctsgnb ; It works like a charm Smilie

---------- Post updated at 04:10 AM ---------- Previous update was at 04:07 AM ----------

Could you let me know on which UNix resources i will have to refer to if i need to scale up in this particular arena
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk output yields error: awk:can't open job_name (Autosys)

Good evening, Im newbie at unix specially with awk From an scheduler program called Autosys i want to extract some data reading an inputfile that comprises jobs names, then formating the output to columns for example 1. This is the inputfile: $ more MapaRep.txt ds_extra_nikira_usuarios... (18 Replies)
Discussion started by: alexcol
18 Replies

2. Shell Programming and Scripting

Pass awk field to a command line executed within awk

Hi, I am trying to pass awk field to a command line executed within awk (need to convert a timestamp into formatted date). All my attempts failed this far. Here's an example. It works fine with timestamp hard-codded into the command echo "1381653229 something" |awk 'BEGIN{cmd="date -d... (4 Replies)
Discussion started by: tuxer
4 Replies

3. Shell Programming and Scripting

Passing awk variable argument to a script which is being called inside awk

consider the script below sh /opt/hqe/hqapi1-client-5.0.0/bin/hqapi.sh alert list --host=localhost --port=7443 --user=hqadmin --password=hqadmin --secure=true >/tmp/alerts.xml awk -F'' '{for(i=1;i<=NF;i++){ if($i=="Alert id") { if(id!="") if(dt!=""){ cmd="sh someScript.sh... (2 Replies)
Discussion started by: vivek d r
2 Replies

4. Shell Programming and Scripting

HELP with AWK one-liner. Need to employ an If condition inside AWK to check for array variable ?

Hello experts, I'm stuck with this script for three days now. Here's what i need. I need to split a large delimited (,) file into 2 files based on the value present in the last field. Samp: Something.csv bca,adc,asdf,123,12C bca,adc,asdf,123,13C def,adc,asdf,123,12A I need this split... (6 Replies)
Discussion started by: shell_boy23
6 Replies

5. Shell Programming and Scripting

awk command to compare a file with set of files in a directory using 'awk'

Hi, I have a situation to compare one file, say file1.txt with a set of files in directory.The directory contains more than 100 files. To be more precise, the requirement is to compare the first field of file1.txt with the first field in all the files in the directory.The files in the... (10 Replies)
Discussion started by: anandek
10 Replies

6. Shell Programming and Scripting

Comparison and editing of files using awk.(And also a possible bug in awk for loop?)

I have two files which I would like to compare and then manipulate in a way. File1: pictures.txt 1.1 1.3 dance.txt 1.2 1.4 treehouse.txt 1.3 1.5 File2: pictures.txt 1.5 ref2313 1.4 ref2345 1.3 ref5432 1.2 ref4244 dance.txt 1.6 ref2342 1.5 ref2352 1.4 ref0695 1.3 ref5738 1.2... (1 Reply)
Discussion started by: linuxkid
1 Replies

7. Shell Programming and Scripting

Problem with awk awk: program limit exceeded: sprintf buffer size=1020

Hi I have many problems with a script. I have a script that formats a text file but always prints the same error when i try to execute it The code is that: { if (NF==17){ print $0 }else{ fields=NF; all=$0; while... (2 Replies)
Discussion started by: fate
2 Replies

8. Shell Programming and Scripting

awk: assign variable with -v didn't work in awk filter

I want to filter 2nd column = 2 using awk $ cat t 1 2 2 4 $ VAR=2 #variable worked in print $ cat t | awk -v ID=$VAR ' { print ID}' 2 2 # but variable didn't work in awk filter $ cat t | awk -v ID=$VAR '$2~/ID/ { print $0}' (2 Replies)
Discussion started by: honglus
2 Replies

9. Shell Programming and Scripting

scripting/awk help : awk sum output is not comming in regular format. Pls advise.

Hi Experts, I am adding a column of numbers with awk , however not getting correct output: # awk '{sum+=$1} END {print sum}' datafile 2.15291e+06 How can I getthe output like : 2152910 Thank you.. # awk '{sum+=$1} END {print sum}' datafile 2.15079e+06 (3 Replies)
Discussion started by: rveri
3 Replies

10. Shell Programming and Scripting

Awk problem: How to express the single quote(') by using awk print function

Actually I got a list of file end with *.txt I want to use the same command apply to all the *.txt Thus I try to find out the fastest way to write those same command in a script and then want to let them run automatics. For example: I got the file below: file1.txt file2.txt file3.txt... (4 Replies)
Discussion started by: patrick87
4 Replies
Login or Register to Ask a Question