Awk Multiple Field Separators


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Awk Multiple Field Separators
# 1  
Old 04-07-2004
Awk Multiple Field Separators

Hi Guys,

I'm tying to split a line similar to this:
Code:
YO6-2000-30.htm:                                               (3 properties found).

......into separate columns, so effectively I need to check for a -, ., :, a tab and a space in the statement.

Any help would be appreciated

Thanks!

Last edited by rbatte1; 12-17-2019 at 10:00 AM..
# 2  
Old 04-07-2004
Does your data look like this? YO6-2000-30.htm: or like this?YO6-2000-30.htm: (3 properties found).

In the first case, set RS = ":" to delimit each record and then you can parse each field within the record using regexp's. In the latter case, play the same game by setting RS = ")."

Last edited by rbatte1; 12-17-2019 at 10:02 AM..
# 3  
Old 04-07-2004
Google,

The line is exactly as printed.

So :
Code:
YO6-2000-30.htm: (3 properties found).

......needs to become
Code:
 $1   $2    $3  $4   $5
YO6   2000  30  htm  (3 properties found)

I understand that $5 could affectively become:
Code:
$5   $6           $7
(3   properties   found)

....but that's manageable!

Last edited by rbatte1; 12-17-2019 at 10:04 AM..
# 4  
Old 04-07-2004
Awk takes input and creates "records" by delimiting by the value of RS. Awk delimits each "record" by the value of "FS", the field separator. You can then slice and dice each value of a field at your whim. In addition, if you dont have an easy way to split records and fields, Awk (gawk) allows you to define your own record by specifying column widths using the FIELDWIDTHS variable. Example
Code:
BEGIN  { FIELDWIDTHS = "9 6 10 6 7 7 35" }

.....will define a record of fixed width including whitespace between columns. So $1 is defined as a field of 9 bytes, $2 is defined as a field of 6 bytes and so on.

This is a pretty good tutorial on Awk. GNU Awk Tutorial

Last edited by rbatte1; 12-17-2019 at 10:05 AM..
# 5  
Old 04-07-2004
Google,

I can't rely on fixed width fields, as the length changes. I was hoping for a command something like :
Code:
awk ' {FS = "[:, -]+" } { print $1 $2 $3 $4 $5}'

Of course, this syntax is wrong...but you know what I'm getting at yeah?

Last edited by rbatte1; 12-17-2019 at 10:05 AM..
# 6  
Old 04-07-2004
You can massage the data a bit by changing all of the "(" and ")" and "." to a ":" before you parse the data. Once you have that then all of your data looks the same. Set FS = ":" to define your fields, set OFS to some output delimiter you need and print your data. If you need the parens in the output, add them back in your print statement. Remember, Awk does not change the original record so you can make these changes for the purposes of your program without mucking anything up!

Code:
gensub(regexp, replacement, how [, target]) # 
gensub is a general substitution function. Like sub and gsub, it 
searches the target string target for matches of the regular 
expression regexp. Unlike sub and gsub, the modified string is 
returned
as the result of the function and the original target string is not 
changed. If how is a string beginning with g or G, then it replaces
 all matches of regexp with replacement. Otherwise, how is 
treated as a number that indicates which match of regexp to 
replace. If no target is supplied, $0 is used.
 

gensub provides an additional feature that is not available in sub
 or gsub: the ability to specify components of a regexp in the
replacement text. This is done by using parentheses in the regexp
 to mark the components and then specifying \N in the 
replacement text, where N is a digit from 1 to 9. For example:


Last edited by google; 04-07-2004 at 08:24 AM..
# 7  
Old 04-07-2004
Yeah, thought of that but my curiosity got me wondering if there's a single expression I can use.

Thanks anyway!
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Parsing out data with multiple field separators

I have a large file that I need to print certain sections out of. file.txt /alpha/beta/delta/gamma/425/590/USC00015420.blah.lt.0.01.str:USC00015420Y2017M10BLALT.01 12 13 14 -9 1 -9 -9 -9 -9 -9 1 2 3 4 5 -9 -9 I need to print the "USC00015420" and... (5 Replies)
Discussion started by: ncwxpanther
5 Replies

2. Shell Programming and Scripting

awk multiple filed separators

There is an usual ifconfig output vlan30 Link encap:Ethernet HWaddr inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: 2407:4c00:0:1:aaff::1/64 Scope:Global inet6 addr: fe80::224:e8ff:fe6b:cc4f/64 Scope:Link UP BROADCAST... (1 Reply)
Discussion started by: urello
1 Replies

3. Shell Programming and Scripting

awk multiple fields separators

Can you please help me with this .... Input File share "FTPTransfer" "/v31_fs01/root/FTP-Transfer" umask=022 maxusr=4294967295 netbios=NJ09FIL530 share "Test" "/v31_fs01/root/Test" umask=022 maxusr=4294967295 netbios=NJ09FIL530 share "ENR California" "/v31_fs01/root/ENR California"... (14 Replies)
Discussion started by: greycells
14 Replies

4. Shell Programming and Scripting

Multiple long field separators

How do I use multiple field separators in awk? I know that if I use awk -F"", both a and b will be field separators. But what if I need two field separators that both are longer than one letter? If I want the field separators to be "ab" and "cd", I will not be able to use awk -F"". The ... (2 Replies)
Discussion started by: locoroco
2 Replies

5. UNIX for Dummies Questions & Answers

Can one use 2 field separators in awk?

I have files such as n02-z30-dsr65-terr0.25-dc0.008-16x12drw-run1.cmd I am wondering if it is possible to define two field separators "-" and "." for these strings so that $7 is run1. (5 Replies)
Discussion started by: kristinu
5 Replies

6. Shell Programming and Scripting

Comparing the matches in two files using awk when both files have their own field separators

I've two files with data like below: file1.txt: AAA,Apples,123 BBB,Bananas,124 CCC,Carrot,125 file2.txt: Store1|AAA|123|11 Store2|BBB|124|23 Store3|CCC|125|57 Store4|DDD|126|38 So,the field separator in file1.txt is a comma and in file2.txt,it is | Now,the output should be... (2 Replies)
Discussion started by: asyed
2 Replies

7. UNIX Desktop Questions & Answers

awk Varing Field Separators

Hi Guys, I have small dilemma which I could do with a little help solving . I currently have text HDD S.M.A.R.T report which I have pasted below: smartctl 5.39 2008-10-24 22:33 (openSUSE RPM) Copyright (C) 2002-8 by Bruce Allen, http://smartmontools.sourceforge.net Device: COMPAQ... (2 Replies)
Discussion started by: bikerben
2 Replies

8. Shell Programming and Scripting

AWK multiple fields separators

I need to print the second field of a file, taking spaces, tab and = as field separators. ; for 16-bit app support MAPI=1 CMC=1 CMCDLLNAME32=mapi32.dll CMCDLLNAME=mapi.dll MAPIX=1 MAPIXVER=1.0.0.1 OLEMessaging=1 asf=MPEGVideo asx=MPEGVideo ivf=MPEGVideo m3u=MPEGVideo (2 Replies)
Discussion started by: PamPam
2 Replies

9. UNIX for Dummies Questions & Answers

Multiple field separators in awk? (First a space, then a colon)

How do I deal with extracting a portion of a record when multiple field separators are involved. Let's say I have: Mike Harrington;(555) 555-5555:250:100:175 Christian Dobbins;(555) 555-2358:155:90:201 Susan Dalsass;(555) 555-6279:250:60:50 Archie McNichol;(555) 555-1348:250:100:175 Jody... (3 Replies)
Discussion started by: doubleminus
3 Replies

10. Shell Programming and Scripting

Multiple input field Separators in awk.

I saw a couple of posts here referencing how to handle more than one input field separator in awk. I figured I would share how I (just!) figured out how to turn this line in a logfile: 90000000000000000000010001 name... (4 Replies)
Discussion started by: kinksville
4 Replies
Login or Register to Ask a Question