jimm08998
jimm08998

Reputation: 1

Match by column and print to line

Tried searching but could not find anything substancial

I have 2 files:
1:

asdfdata:tomatch1:asdffdataaa
asdfdata2:tomatch2:asdffdata33
asdf:tomatch3:asdfx

2:

bek:tomatch1:beke  
lek:tomatch3:lekee  
wen:tomatch2:wenne    

I would like to match by the second clolumn in both, by whatever data is on the line, then take this and print to lines like so:

asdfdata:tomatch1:asdffdataaa:bek:beke
asdfdata2:tomatch2:asdffdata33:wen:wenne    

etc.

I imagine awk would be best, Match two files by column line by line - no key it seems kind of similiar to this!
Thank you for any help!!

Upvotes: 0

Views: 63

Answers (3)

potong
potong

Reputation: 58420

This might work for you (GNU sed):

sed -r 's|(.*)(:.*:)(.*)|/\2/s/$/:\1:\3/|' file2 | sed -f - file1

This constructs a sed script from the file2 to run against file1.

Upvotes: 0

SMA
SMA

Reputation: 37023

Use join command like:

join -t":" -1 2 -2 2 <(sort -t":" -k 2 file1.txt) <(sort -t":" -k 2 file2.txt)

Here's how it would work:

-t is for delimeter
-1 - from first file second field delimeted by ":"
-2 - from second file second field delimeted by ":"
join needs input file to be sorted on field which we want to join by hence you see sort command with second field specified with -k option and t option again using delimeter as colon (:) and passed input to join command after sorting the input by second field.

Upvotes: 1

Wintermute
Wintermute

Reputation: 44043

I think this is most simple with join and sort. Assuming bash (for the process substitution):

join -t :  -j 2 <(sort -t :  -k 2 file1) <(sort -t : -k 2 file2)

Alternatively, with awk (if bash cannot be relied upon and temporary files are not wanted):

awk -F : 'NR == FNR { a[$2] = $0; next } { line = a[$2] FS $1; for(i = 3; i <= NF; ++i) line = line FS $i; print line }' file1 file2

That is

NR == FNR {                   # while processing the first file
  a[$2] = $0                  # remember lines by key
  next
}
{                             # while processing the second file
  line = a[$2] FS $1          # append first field to remembered line
                              # from the first file with the current key
  for(i = 3; i <= NF; ++i) {  # append all other fields (except the second)
    line = line FS $i
  }
  print line                  # print result
}

Upvotes: 0

Related Questions