Match pattern in a field, print pattern only instead of the entire field


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers Match pattern in a field, print pattern only instead of the entire field
# 1  
Old 03-01-2012
Match pattern in a field, print pattern only instead of the entire field

Hi !

I have a tab-delimited file, file.tab:
Code:
Column1             Column2                              Column3
aaaaaaaaaa          bbtomatoesbbbbbb          cccccccccc
ddddddddd          eeeeappleseeeeeeeee        ffffffffffffff
ggggggggg          hhhhhhtomatoeshhh        iiiiiiiiiiiiiiii


I would need to:
1) Search, only in field $2, the pattern "tomatoes" among the string of letters (I wrote it in bold just for the example)
2) Print the lines with the pattern "tomatoes" in field $2, but only with the pattern printed in $2 instead of the entire string.

In order to obtain output.tab:
Code:
Column1             Column2        Column3
aaaaaaaaaa          tomatoes        cccccccccc
ggggggggg          tomatoes        iiiiiiiiiiiiiiii

I hope my query is clear enough...Smilie
or at least tell me if it is doable !!!!
# 2  
Old 03-01-2012
Code:
awk '$2 ~ /tomato/{printf $1 "\t" "tomato " "\t" $3}'

# 3  
Old 03-01-2012
Hi codemaniac, thank you for your help !

And what about if my pattern is a bit variable, let's say:
Code:
Column1	Column2	Column3
aaaaaaaaaa	bb11tomatoes111bbbbbb	cccccccccc
ddddddddd	eeee2222apples2eeeeeeeee	ffffffffffffff
ggggggggg	hhhhhh33333tomatoes33333hhh	iiiiiiiiiiiiiiii

In order to obtain:
Code:
aaaaaaaaaa	11tomatoes111	cccccccccc
ggggggggg	33333tomatoes33333	iiiiiiiiiiiiiiii

I tried that, but it doesn't work:
Code:
awk '$2 ~ /[13]{1,5}tomatoes[13]{1,5}/ {print $1 "\t" [13]{1,5}tomatoes[13]{1,5} "\t" $3}' file.tab

Even the /search/ part of the command doesn't seem to work, but for me it is correct !!!

---------- Post updated at 08:42 PM ---------- Previous update was at 07:34 PM ----------

Whereas the pattern works with egrep:
Code:
egrep '[13]{1,5}tomatoes[13]{1,5}' file.tab

---------- Post updated at 09:22 PM ---------- Previous update was at 08:42 PM ----------

It seems like awk doesn't recognise the brackets [] followed by braces{} !
# 4  
Old 03-01-2012
Change the text in blue to whatever pattern you wish to match

Code:
$ perl -lane 'if ($F[1] =~ /(tomatoes)/) {$F[1] =~ s/.*?($1).*/$1/; print join ("\t", @F)}' file.tab
aaaaaaaaaa      tomatoes        cccccccccc
ggggggggg       tomatoes        iiiiiiiiiiiiiiii
$
$ perl -lane 'if ($F[1] =~ /([13]{1,5}tomatoes[13]{1,5})/) {$F[1] =~ s/.*?($1).*/$1/; print join ("\t", @F)}' file.tab
aaaaaaaaaa      11tomatoes111   cccccccccc
ggggggggg       33333tomatoes33333      iiiiiiiiiiiiiiii
$

# 5  
Old 03-02-2012
Thanks again balajesuri !

However, I just realise that the second field sometimes contain spaces in the string:
Code:
Column1	Column2	Column3
aaaaaaaaaa	bb11 toma toes 111b bbbbb	cccccccccc
ddddddddd	eeee 2222 appl es2e eeee eeee	ffffffffffffff
ggggggggg	hhhh hh33 333t omat oes3 3333 hhh	iiiiiiiiiiiiiiii

How could I delete the spaces ONLY in the second field before applying your command?
I tried that, but it delete the spaces in the entire line instead of only in the second field:
Code:
awk '$2 {gsub(/ /,"");print}' file.tab

# 6  
Old 03-02-2012
Assuming your columns are tab-separated.

Code:
perl -F"\t" -lane '$F[1]=~s/ //g;if ($F[1] =~ /([13]{1,5}tomatoes[13]{1,5})/) {$F[1] =~ s/.*?($1).*/$1/; print join ("\t", @F)}' file.tab

# 7  
Old 03-02-2012
Ok !

I know I should post another thread, but I am just curious.
What is wrong in my previous command, if I just want to remove space in a particular field only (let' say I am not interested in finding a pattern)
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Get output of multiple pattern match from first field to a file

Hi All, Greetings! I have a file of 40000+ lines with different entries, I need matching entries filterd out to their files based on first filed pattern for the matching : For example: All server1 entries (in field1) to come together with its path in 2nd field. The best output I want... (9 Replies)
Discussion started by: rveri
9 Replies

2. Shell Programming and Scripting

Print field after pattern in all lines

data: hello--hello1--hello2--#growncars#vello--hello3--hello4--jello#growncars#dello--gello--gelloA--gelloB#growncars# I want to be able to print all the values that are found between the patterns "#growncars#" and the next "#growncars#" on the same line. so the output should be: ... (8 Replies)
Discussion started by: SkySmart
8 Replies

3. Shell Programming and Scripting

Command/script to match a field and print the next field of each line in a file.

Hello, I have a text file in the below format: Source Destination State Lag Status CQA02W2K12pl:D:\CAQA ... (10 Replies)
Discussion started by: pocodot
10 Replies

4. Shell Programming and Scripting

Awk: print lines with one of multiple pattern in the same field (column)

Hi all, I am new to using awk and am quickly discovering what a powerful pattern-recognition tool it is. However, I have what seems like a fairly basic task that I just can't figure out how to perform in one line. I want awk to find and print all the lines in which one of multiple patterns (e.g.... (8 Replies)
Discussion started by: elgo4
8 Replies

5. UNIX for Dummies Questions & Answers

Match Pattern after certain pattern and Print words next to Pattern

Hi experts , im new to Unix,AWK ,and im just not able to get this right. I need to match for some patterns if it matches I need to print the next few words to it.. I have only three such conditions to match… But I need to print only those words that comes after satisfying the first condition..... (2 Replies)
Discussion started by: 100bees
2 Replies

6. Shell Programming and Scripting

Displaying the first field if the second field matches the pattern using Perl

Hi, I am trying with the below Perl command to print the first field when the second field matches the given pattern: perl -lane 'open F, "< myfile"; for $i (<F>) {chomp $i; if ($F =~ /patt$/) {my $f = (split(" ", $i)); print "$f";}} close F' dummy_file I know I can achieve the same with the... (7 Replies)
Discussion started by: royalibrahim
7 Replies

7. Shell Programming and Scripting

AWK: Pattern match between 2 files, then compare a field in file1 as > or < field in file2

First, thanks for the help in previous posts... couldn't have gotten where I am now without it! So here is what I have, I use AWK to match $1 and $2 as 1 string in file1 to $1 and $2 as 1 string in file2. Now I'm wondering if I can extend this AWK command to incorporate the following: If $1... (4 Replies)
Discussion started by: right_coaster
4 Replies

8. Shell Programming and Scripting

print the last line of an recurring pattern on the 3rd field

How can i awk/sed to print the last line of an recurring pattern on the 3rd field? Input lines: 123456.1 12 1357911 11111.1 01 123456.2 12 1357911 11111.2 02 123456.3 12 1357911 11111.3 03 123456.4 12 1357911 11111.4 04 123456.5 12 1357911 11111.5 05 246810.1 12 1357911 22222.1 01... (4 Replies)
Discussion started by: ux4me
4 Replies

9. Shell Programming and Scripting

Print line if first Field matches a pattern

Hi All, I would like my code to be able to print out the whole line if 1st field has a dot in the number. Sample input and expected output given below. My AWK code is below but it can;t work, can any expert help me ? Thanks in advance. {if ($1 ~ /*\.*/) { print $0 }} Input: ... (2 Replies)
Discussion started by: Raynon
2 Replies

10. Shell Programming and Scripting

how do i pattern match a field with awk?

hi, let's say $numbers = "324 350 587" an so on... what i'm trying to do is this: awk -v numbers="$numbers" '{if (numbers ~ /$2/) print $0, "bla bla"}' file # file looks like this: 214 ..... 215 ... 216 .... 250 ... 324 325 ... 350 something ... ... 587 ... (4 Replies)
Discussion started by: someone123
4 Replies
Login or Register to Ask a Question

Featured Tech Videos