União de dois arquivos e única no novo arquivo

1

Eu tenho dois arquivos com poucas colunas semelhantes, uma, duas e terceira coluna com pequena variação e algumas outras colunas da seguinte forma.

arquivo 1:

AT1  AT22  24  1 ATAGATA ATTATAT
AT2  AT24  22  0 ATAGATA ATTATAT
AT3  AT23  263 3 ATAGATA ATTATAT
AT4  AT28  252 6 ATAGATA ATTATAT

Similarmente no arquivo 2:

AT1  AT22  22  1 ATAGATA ATTATAT
AT3  AT23  265  1 ATAGATA ATTATAT
AT4  AT28  253  1 ATAGATA ATTATAT

A saída deve ser Union e única desses arquivos com relaxamento de + ou -2 da terceira coluna e se as três primeiras correspondências com esses critérios, a quarta coluna tiver que ser adicionada a partir dos arquivos e outros devem ser impressos como de costume, que é como

AT1  AT22  24  2 ATAGATA ATTATAT
AT2  AT24  22  0 ATAGATA ATTATAT
AT3  AT23  263 4 ATAGATA ATTATAT
AT4  AT28  252 7 ATAGATA ATTATAT
    
por Bio_Ram 31.03.2014 / 23:06

2 respostas

3

awk '
    NR==FNR {
        a[$1,$2] = $3
        val[$1,$2] = $4
        next
    } 
    ($1,$2) in a {
        for (n=$3-2; n<=$3+2; n++)
            if (a[$1,$2] == n) {
                $4+=val[$1,$2]
                break
            }
    } 
    {print}
' file2 file1
AT1 AT22 24 2 ATAGATA ATTATAT
AT2  AT24  22  0 ATAGATA ATTATAT
AT3 AT23 263 4 ATAGATA ATTATAT
AT4 AT28 252 7 ATAGATA ATTATAT
    
por 01.04.2014 / 00:31
1

Isso deve fazer o que você pediu (na medida em que meus casos de teste funcionem)

#!/bin/bash

# Concatenating the 2 files and sorting entries

SRC='cat file1 file2 | sort '
FLAG="OFF"
i=1

while read a b c d e

do
 # Need an initial array to start comparing
 if [ "$i" -eq "1"  ];then
  init_vals=( "$a" "$b" "$c" "$d" "$e" )
  FLAG="ON"
 else
  # Start comparing
  vals=( "$a" "$b" "$c" "$d" "$e" )
  if [[ ${vals[0]} ==  "${init_vals[0]}" && ${vals[1]} == "${init_vals[1]}" ]]
   then
    # First and second column are identical, checking in delta on third meet the requirements
    delta='expr ${vals[2]} - ${init_vals[2]}'
    if [ "$delta" -ge "-2" -a "$delta" -le "2" ]
    then
      # It does, adding values on column 4 and keeping other columns
      sum_col4='expr ${vals[3]} + ${init_vals[3]}'
      vals=( "${init_vals[0]}" "${init_vals[1]}" "${init_vals[2]}" "$sum_col4" "${init_vals[4]}" )
      #This is a tracker, we don't print result until conditions are not met
      FLAG="ON"
    else
      #Delta on column 3 is not met
      FLAG="OFF"
    fi
  else
    #Column 1 and 2 are different
    FLAG="OFF"
  fi
#    echo "$FLAG"

   if [[ $FLAG != "ON" ]];then
     echo ${init_vals[@]}
     FLAG="ON"
   fi
   init_vals=( "${vals[@]}" )

 fi
 (( i++ ))
done <<< "$SRC"
#Printing last lastline
echo ${init_vals[@]}
    
por 01.04.2014 / 00:31

Tags