awk question ? set 2 variables by matching fields


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting awk question ? set 2 variables by matching fields
# 1  
Old 05-08-2013
awk question ? set 2 variables by matching fields

Hello,
I'm trying to get the TOP and BASE numbers printed out
File looks like this:

Code:
2300  CAR   # 2300 is the TOP
2310  CAR
2335  CAR
2455  CAR   # 2455 is the BASE
1000  MOTOR  # 2455 will become this TOP
2000  MOTOR  
3000  MOTOR
4000  MOTOR   # 4000 is the BASE
2345  BIKE     # 4000 becomes this TOP
2347  BIKE     # 2347 is the BASE

The output needs to READ like this:

Code:
CAR        2300 2455
MOTOR  2455 4000
BIKE        4000 2347

please let me know if this needs more explanation,
my files are 500,000 ROWS of data in this format.

Thanks in advance for your Help.

Last edited by Scott; 05-08-2013 at 03:00 AM.. Reason: Please use code tags for code and data
# 2  
Old 05-08-2013
This might work..

Code:
 
awk '/TOP/{v=$2" "$4};/BASE/{b=$4;c=1}{if(c){print v" "b;c=0}}' filename

# 3  
Old 05-08-2013
Code:
awk '
        ++A[$2] == 1 {
                if ( NR == 1 )
                        printf "%s %d ", $2, ( t ? t : $1 )
                else
                        printf "%d\n%s %d ", ( t ? t : $1 ), $2, ( t ? t : $1 )
        }
        {
                t = $1
        }
        END {
                printf "%d\n", t
        }
' file

# 4  
Old 05-08-2013
Quote:
Originally Posted by vidyadhar85
This might work..
Code:
 
awk '/TOP/{v=$2" "$4};/BASE/{b=$4;c=1}{if(c){print v" "b;c=0}}' filename

This could be shorten some to:
Code:
awk '/TOP/{v=$2" "$4};/BASE/{print v" "$4}'

No need for the if statement to test for a true variable:
Code:
{if(c){print v" "b;c=0}}

Could be written like this
Code:
c{print v" "b;c=0}

# 5  
Old 05-08-2013
Quote:
Originally Posted by Jotne
This could be shorten some to:
Code:
awk '/TOP/{v=$2" "$4};/BASE/{print v" "$4}'

No need for the if statement to test for a true variable:
Code:
{if(c){print v" "b;c=0}}

Could be written like this
Code:
c{print v" "b;c=0}

Completely agree with you, However as you know writing c or if(c) will take same number of CPU cycles to evalute it so its not going to make any proformace issues as far as this holds good I prefer to write more presentable and redable code for the user as most of them are quite new to unix Smilie

Its all depends on Individual working style.
This User Gave Thanks to vidyadhar85 For This Post:
# 6  
Old 05-08-2013
Quote:
take same number of CPU
I did not know this, and agree with you that write it readable is more important than short.

Semicolon is also not needed
awk '/TOP/{v=$2" "$4};/BASE/{print v" "$4}'
awk '/TOP/{v=$2" "$4} /BASE/{print v" "$4}'
# 7  
Old 05-08-2013
Thanks everybody, I'm going to try Yoda's solution.
I must have confused some on the format of my file, I only put the comments # this is TOP
# This will be the BASE For clarity. I wish I could just match on those names, but the only text to grab
is from one NAME to when the NAME changes.

I appreciate your help.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

awk for matching fields between files with repeated records

Hello all, I am having trouble with what should be an easy task, but seem to be missing something fundamental. I have two files, with File 1 consisting of a single field of many thousands of records. I also have File 2 with two fields and many thousands of records. My goal is that when $1 of... (2 Replies)
Discussion started by: jvoot
2 Replies

2. UNIX for Beginners Questions & Answers

Awk: matching multiple fields between 2 files

Hi, I have 2 tab-delimited input files as follows. file1.tab: green A apple red B apple file2.tab: apple - A;Z Objective: Return $1 of file1 if, . $1 of file2 matches $3 of file1 and, . any single element (separated by ";") in $3 of file2 is present in $2 of file1 In order to... (3 Replies)
Discussion started by: beca123456
3 Replies

3. Shell Programming and Scripting

Awk: adding fields after matching $1

Dear AWK-experts! I did get stuck in the task of combining files after matching fields, so I'm still awkward with learning AWK. There are 2 files: one containing 3 columns with ID, coding status, and score for long noncoding RNAs: file1 (1.txt) (>5000 lines) ... (12 Replies)
Discussion started by: kben
12 Replies

4. UNIX for Advanced & Expert Users

awk print all fields except matching regex

grep -v will exclude matching lines, but I want something that will print all lines but exclude a matching field. The pattern that I want excluded is '/mnt/svn' If there is a better solution than awk I am happy to hear about it, but I would like to see this done in awk as well. I know I can... (11 Replies)
Discussion started by: glev2005
11 Replies

5. Shell Programming and Scripting

Awk - Script assistance on identifying non matching fields

Hoping for some assistance. my source file consists of: os, ip, username win7, 123.56.78, john win7, 123.56.78, paul win7, 10.1.1.1, john win7, 10.2.2.3, joe I've been trying to run a script that will only return ip and username where the IP address is the same and the username is... (3 Replies)
Discussion started by: tekvaio
3 Replies

6. UNIX for Dummies Questions & Answers

Set variables from fields in fields

Hi, This is my first post here and I am a newbie. :) I have a file that looks like this : Introduction:Intro_123.html Product definition:Prod_def.html System Setup:SSetup-64bit.html Setting up user accounts:Set_user_acc.html I tried to create a script that would output "The filename... (3 Replies)
Discussion started by: Joq
3 Replies

7. Shell Programming and Scripting

AWK : Add Fields of lines with matching field

Dear All, I would like to add values of a field, if the lines match in a certain field. Then I would like to divide the sum though the number of lines that have a matched field. This is the Input: Input: Test1 5 Test1 10 Test2 2 Test2 5 Test2 13 Test3 4 Output: Test1 7.5 Test1 7.5... (6 Replies)
Discussion started by: DerSeb
6 Replies

8. Shell Programming and Scripting

AWK- delimiting the strings and matching the fields

Hello, I am newbie in awk. I have just started learning it. 1) I have input file which looks like: {4812 4009 1602 2756 306} {4814 4010 1603 2757 309} {8116 9362 10779 } {10779 10121 9193 10963 10908} {1602 2756 306 957 1025} {1603 2757 307} and so on..... 2) In output: a)... (10 Replies)
Discussion started by: kajolo
10 Replies

9. Shell Programming and Scripting

Awk - Compare fields and increment variables

Hi, My first post to this group... I have a need to to parse a source file which is a capture from a network analyser. I have two fields that need to be checked: - Field 7 represents the packet length (an integer), and Field 4 represents a network address (e.g. 192.168.25.3) - The... (10 Replies)
Discussion started by: mv652
10 Replies

10. Shell Programming and Scripting

AWK Matching Fields and Combining Files

Hello! I am writing a program to run through two large lists of data (~300,000 rows), find where rows in one file match another, and combine them based on matching fields. Due to the large file sizes, I'm guessing AWK will be the most efficient way to do this. Overall, the input and output I'm... (5 Replies)
Discussion started by: Michelangelo
5 Replies
Login or Register to Ask a Question