Visit Our UNIX and Linux User Community


Updating specific fields with awk using conditions


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers Updating specific fields with awk using conditions
# 1  
Old 06-05-2009
Updating specific fields with awk using conditions

Can someone help me again, I think with awk? I have a file with 4 columns (pipe-delimited):

Quote:
Ex:
a0|b0|c0|e1:e2
a1|b1|c1|e0
a2|b2|c2|e0:e1
a3|b3|c3|e3
a4|b4|c4|e1
I just want to convert the last field so that e1 is now 'message 1', e2 is 'message 2', e0 is 'message 3', etc. I don't want to change any other columns because the e0-e10 code may appear as part of a description elsewhere in the file so it has to be only the last field that should change.

This will convert like 'e1' by itself but not ':e1' or 'e1:e10', etc.
Code:
awk 'BEGIN{OFS=FS="|"} $4=="e1"||$4==":e1"{$4="message 1"}{print}' myfile

If I did this, the entire last field changes to one error message:
Code:
awk 'BEGIN{OFS=FS="|"} $4~"e1"{$4="message 1"}{print}' myfile

How do I handle about 10 different codes in one awk statement and also convert the colon that separates the 'e' codes to a comma in the last field after I spit out a friendly message so I get this...

Quote:
a0|b0|c0|message 1,message 2
a1|b1|c1|message 0
a2|b2|c2|message 0, message 1
...
a100|b100|c100|message 5, message 10
etc..
Everytime I try to write an if-else into the block, my awk code blows up...

Thanks.
Gianni
# 2  
Old 06-05-2009
This could work for you

Code:
 
awk 'BEGIN{OFS=FS="|"}
{
firstpart=substr($4,1,1)
secondpart=substr($4,4,1)
n1=substr($4,2,1)
n2=substr($4,5,1)
if ( secondpart == "e" )
{
  $4=sprintf("message %d, message %d", n1, n2)
}
else if ( firstpart == "e" )
{
    $4=sprintf("message %d", n1)
}
print
}' myfile

# 3  
Old 06-08-2009
Thanks for your help. The only problem is that it only works if those are actual values which won't normally be the case in real world situations.

Those are examples to make it easy to get the point across problem across.
Sample data:
01440|27722011|37271144|PI:SK
03421|908900-APA-2121|90-APAJL-11AAP|QM
43033|21XZ121L|QUMU34121A|QM:PI
45131|10-11-21AJQX|34PAM-42|UD
etc...

I was trying convert the last field codes to something like this:

01440|27722011|37271144|Invalid Product,Invalid SKU
03421|908900-APA-2121|90-APAJL-11AAP|Missing Quantity
43033|21XZ121L|QUMU34121A|Missing Quantity,Invalid Product
45131|10-11-21AJQX|34PAM-42|Unknown Destination
etc.

Thanks for your help/time though.
# 4  
Old 06-08-2009
Having a 'look up' file gia.cfg:
Code:
PI|Invalid Product
SK|Invalid SKU
QM|Missing Quantity
UD|Unknown Destination

and a file gia.txt to be processed:
Code:
01440|27722011|37271144|PI:SK
03421|908900-APA-2121|90-APAJL-11AAP|QM
43033|21XZ121L|QUMU34121A|QM:PI
45131|10-11-21AJQX|34PAM-42|UD

nawk -f gia.awk gia.cfg gia.txt

gia.awk:
Code:
BEGIN {
  FS=OFS="|"

  SEPlistIN=":"
  SEPlistOUT=","

  STRunknown="Unknown Key"
}
FNR==NR {
  key[$1]=$2
  next
}
{
  str=""
  n=split($NF, a, SEPlistIN)
  for(i=1;i<=n; i++)
    str=( ((i==1)? "":str SEPlistOUT)  ((a[i] in key)? key[a[i]] : STRunknown) )
  $NF=str
  print
}


Last edited by vgersh99; 08-19-2009 at 09:00 AM..
# 5  
Old 06-08-2009
Thank you. This was a very good solution since I already had a lookup table so no need to hardcode.

-Gianni
 

Previous Thread | Next Thread
Test Your Knowledge in Computers #733
Difficulty: Medium
AmigaBASIC is a complied BASIC programming language implementation for the Amiga, designed and written by Microsoft.
True or False?

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk to assign points to variables based on conditions and update specific field

I have been reading old posts and trying to come up with a solution for the below: Use a tab-delimited input file to assign point to variables that are used to update a specific field, Rank. I really couldn't find too much in the way of assigning points to variable, but made an attempt at an awk... (4 Replies)
Discussion started by: cmccabe
4 Replies

2. UNIX for Beginners Questions & Answers

Grep or awk a unique and specific word across many fields

Hi there, I have data with similar structure as this: CHR START-SNP END-SNP REF ALT PATIENT1 PATIENT2 PATIENT3 PATIENT4 chr1 69511 69511 A G homo hetero homo hetero chr2 69513 69513 T C . hetero homo hetero chr3 69814 69814 G C . . homo homo chr4 69815 69815 C A hetero . . hetero is... (10 Replies)
Discussion started by: daashti
10 Replies

3. Shell Programming and Scripting

awk to print fields that match using conditions and a default value for non-matching in two files

Trying to use awk to match the contents of each line in file1 with $5 in file2. Both files are tab-delimited and there may be a space or special character in the name being matched in file2, for example in file1 the name is BRCA1 but in file2 the name is BRCA 1 or in file1 name is BCR but in file2... (6 Replies)
Discussion started by: cmccabe
6 Replies

4. Shell Programming and Scripting

Getting max value of specific fields with awk

Hello All, Here is am trying to get maximum value of third field depending on first,second and fourth fields with awk command . delimeter is pipe(|) . input 0221|09|14.25|aaa 0221|09|44.27|aaa 0221|09|44.33|aaa 0221|09|44.53|bbb 0221|09|34.32|bbb 0221|09|37.13|bbb... (5 Replies)
Discussion started by: sayami00
5 Replies

5. Shell Programming and Scripting

awk to combine all matching fields in input but only print line with largest value in specific field

In the below I am trying to use awk to match all the $13 values in input, which is tab-delimited, that are in $1 of gene which is just a single column of text. However only the line with the greatest $9 value in input needs to be printed. So in the example below all the MECP2 and LTBP1... (0 Replies)
Discussion started by: cmccabe
0 Replies

6. Shell Programming and Scripting

awk to output match and mismatch with count using specific fields

In the below awk I am trying output to one file those lines that match between $2,$3,$4 of file1 and file2 with the count in (). I am also trying to output those lines that are missing between $2,$3,$4 of file1 and file2 with the count of in () each. Both input files are tab-delimited, but the... (7 Replies)
Discussion started by: cmccabe
7 Replies

7. Shell Programming and Scripting

awk partial string match and add specific fields

Trying to combine strings that are a partial match to another in $1 (usually below it). If a match is found than the $2 value is added to the $2 value of the match and the $3 value is added to the $3 value of the match. I am not sure how to do this and need some expert help. Thank you :). file ... (2 Replies)
Discussion started by: cmccabe
2 Replies

8. UNIX for Dummies Questions & Answers

Read the file and generate specific fields by awk

Hi I need to generate these output file from the below input file. Output : customer_id as customer, zip as zip_cd, catg_cd as catg, Input: out.customer::in.customer_id; out.zip_cd::in.zip; out.catg::in.catg_cd; Could you please help me on this. Please use code tags next... (1 Reply)
Discussion started by: Murugesh
1 Replies

9. Shell Programming and Scripting

awk summing specific lines and fields

Hi I would like to know if it is possible to sum some specific fields. I have this x;x;x;x;x;x;x;x;467,390,611 Bytes;0.435291 GB;0.062247 GB;0.373045 GB;11,225;157 a;a;a;a;a;a;a;a;13,805,156,846 Bytes;12.857054 GB;1.838559 GB;11.018495 GB;151,063;18,933 b;b;b;b;b;b;b;b;232,797,478,723... (5 Replies)
Discussion started by: nakaedu
5 Replies

Featured Tech Videos