Putting together substrings if pattern is matched


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Putting together substrings if pattern is matched
# 1  
Old 03-13-2014
Putting together substrings if pattern is matched

What I would like to do is if the lines with % have the same name, then combine the last 9 letters of the string underneath the last occurrence of that ID with the first 9 letters of the string underneath the first occurrence of that ID.

I have a file that looks like this:

Code:
%GOGG
doggocatcatFUNFUNGOGOHIHI
%SONSON
byetailfunfungo
%GOGG
hellobyebyetailfunfungoson
$SONSON
funfungogo

The output should look like this:

Code:
%GOGG
nfungosondoggocatc
%SONSON
unfungogobyetailfu

Notice how %GOGG now has "nfungoson" put together with "doggocatc" and the same with %SONSON. It's worth mentioning that the ID patterns can exist more than 2 times.

Last edited by bartus11; 03-13-2014 at 04:20 PM.. Reason: Please use [code][/code] tags.
# 2  
Old 03-13-2014
Is this classwork/homework?
It can be perfectly done with awk, using its associative arrays and its substr and getline functions.
What have you tried already?
This User Gave Thanks to MadeInGermany For This Post:
# 3  
Old 03-13-2014
This is not homework actually. It's just an annoying problem I've run into and can't figure out. What I have tried is the following but it is no where near useful in my opinion.

Code:
cat file | egrep -A 2 "%" | head -c15 > file.out

# 4  
Old 03-13-2014
An awk solution:
Code:
awk '
        {
                if ( $1 ~ /^%/ )
                {
                        A[$1]++
                        i = $1
                }
                else
                        R[A[i],i] = $0
        }
        END {
                for ( k in A )
                {
                        print k
                        print substr(R[A[k],k],length(R[A[k],k])-8) substr(R[1,k],1,9)
                }
        }
' file

These 2 Users Gave Thanks to Yoda For This Post:
# 5  
Old 03-13-2014
Another one
Code:
awk '
$1~/^%/ {
  key=$1
  next
}
{
  if (key in s1) {
    s2[key]=substr($0,length($0)-8)
  } else {                     
    s1[key]=substr($0,1,9)
  }                  
}
END {               
  for (key in s1) {
    print key
    print s2[key] s1[key]
  }
}
' file

This User Gave Thanks to MadeInGermany For This Post:
# 6  
Old 03-13-2014
Yet one more:
Code:
awk '
  /^%/{
    i=$1
    getline s
    A[i]=(i in A)?substr(s, length(s)-8) substr(A[i],1,9):s
  }
  END{
    for (i in A) {
      print i
      print A[i]
    }
  }
' file

This User Gave Thanks to Scrutinizer For This Post:
# 7  
Old 03-13-2014
Scrutinizer, yours seems to work only when there are multiple occurrences of the string ID and not in events when the string ID exists only once. It should still perform the same for those situations.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Compare two files when pattern matched

I have two files say FILE1 and FILE2. FILE1 contains 80,000 filename in sorted order and another file FILE2 contains 6,000 filenames is also in sorted order. I want to compare the filename for each file and copy them in to a folder when filename is matched. File1.txt contain 80,000... (8 Replies)
Discussion started by: imranrasheedamu
8 Replies

2. UNIX for Advanced & Expert Users

To print from the first line until pattern is matched

Hi I want to print the line until pattern is matched. I am using below code: sed -n '1,/pattern / p' file It is working fine for me , but its not working for exact match. sed -n '1,/^LAC$/ p' file Input: LACC FEGHRA 0 LACC FACAF 0 LACC DARA 0 LACC TALAC 0 LAC ILACTC 0... (8 Replies)
Discussion started by: Abhisrajput
8 Replies

3. Shell Programming and Scripting

Matched a pattern from multiple columns

Hi, I need to extract an info in $1 based on a matched pattern in $2,$3,$4, and $5. The sample input file as follows:- ID Pat1 Pat2 Pro1 use1 add41 M M M add87 M M M M add32 ... (16 Replies)
Discussion started by: redse171
16 Replies

4. Shell Programming and Scripting

How to use sed to search a particular pattern in a file backward after a pattern is matched.?

Hi, I have two files file1.txt and file2.txt. Please see the attachments. In file2.txt (which actually is a diff output between two versions of file1.txt.), I extract the pattern corresponding to 1172c1172. Now ,In file1.txt I have to search for this pattern 1172c1172 and if found, I have to... (9 Replies)
Discussion started by: saurabh kumar
9 Replies

5. Shell Programming and Scripting

Insert certain field of matched pattern line above pattern

Hello every, I am stuck in a problem. I have file like this. I want to add the fifth field of the match pattern line above the lines starting with "# @D". The delimiter is "|" eg > # @D0.00016870300|0.05501020000|12876|12934|3||Qp||Pleistocene||"3 Qp Pleistocene"|Q # @P... (5 Replies)
Discussion started by: jyu3
5 Replies

6. Shell Programming and Scripting

Print only matched pattern in perl

Hi, I have script like below: #!/usr/local/bin/perl use strict; use warnings; while (<DATA>) { ( my ($s_id) = /^\d+\|(\d+?)\|/ ) ; if ( $s_id == 1 ){ s/^(.*\|)*.*ABC\.pi=(+|+)*.*ABC\.id=(\d+|+).*$/$1$2|$3/s; print "$1$2|$3\n"; (2 Replies)
Discussion started by: sol_nov
2 Replies

7. Shell Programming and Scripting

Grep word between matched pattern

would like to print word between matched patterns using sed for example : create INDEX SCOTT.OR_PK ON table_name(....) would like to print between SCOTT. and ON which is OR_PK Please help me out Thanks (4 Replies)
Discussion started by: jhonnyrip
4 Replies

8. Shell Programming and Scripting

print last matched pattern using perl

Hi, If there exist multiple pattern in a file, how can I find the last record matching the pattern through perl. The below script searches for the pattern everywhere in an input file. #! /usr/bin/perl -s -wnl BEGIN { $pattern or warn"Usage: $0 -pattern='RE' \n" and exit 255;... (5 Replies)
Discussion started by: er_ashu
5 Replies

9. Shell Programming and Scripting

Replacing a word after a matched pattern

Hello, Actually i want to replace the word after a matched pattern. For Ex: lets say that i am reading a file line by line while read line do echo $line # i need to search whether a pattern exists in the file and replace the word after if the pattern exist. # for example :... (1 Reply)
Discussion started by: maxmave
1 Replies

10. UNIX for Dummies Questions & Answers

Count of matched pattern occurance

In a file a pattern is occured many times randomly. Even it may appear more then once in the same line too. How i can get the number of times that pattern appeared in the file? let the file name is abc.txt and the pattern is "xyz". I used the following code: grep -ic "xyz" abc.txt but it is... (3 Replies)
Discussion started by: palash2k
3 Replies
Login or Register to Ask a Question