Como imprimir próxima enésima coluna na linha atual após a correspondência de padrões?

2

Se a primeira e a segunda coluna da próxima linha forem iguais à linha atual, quero imprimir a última coluna de cada linha na linha atual.

Meu arquivo de entrada é

 A 123 BC
 A 123 DD
 A 123 TT
 B 456 AA
 B 456 RR
 C 789 EE

A saída desejada é

 A 123 BC DD TT
 B 456 AA RR
 C 789 EE
    
por user2905046 10.05.2017 / 03:49

4 respostas

2

awk :

awk '{a[$1FS$2]=a[$1FS$2]FS$NF} END {for(i in a) print i a[i]}' 
  • a[$1FS$2]=a[$1FS$2]FS$NF define chaves de matriz associativa como dois primeiros campos separados pelo delimitador de campo e valores como o último campo concatenado ao valor anterior por delimitador de campo

  • END {for(i in a) print i a[i]} é executado no final, itera sobre as chaves da matriz a e as chaves de impressão e os respectivos valores

Exemplo:

% cat file.txt 
A 123 BC
A 123 DD
A 123 TT
B 456 AA
B 456 RR
C 789 EE

% awk '{a[$1FS$2]=a[$1FS$2]FS$NF} END {for(i in a) print i a[i]}' file.txt
A 123 BC DD TT
B 456 AA RR
C 789 EE
    
por 10.05.2017 / 04:57
2

Aqui está uma maneira, com datamash do GNU

$ datamash -Ws groupby 1,2 collapse 3 < file | sed 's/[,\t]/ /g'
A 123 BC DD TT
B 456 AA RR
C 789 EE

O comando sed substitui o campo padrão e recolhe separadores com espaços.

    
por 10.05.2017 / 04:09
1

Primeiramente sort as linhas de entrada file e exclusivas ( -u ) nas duas primeiras colunas -k1,2 e cut da terceira coluna.

Em seguida, repita as linhas em pattern e colete a terceira coluna ( sed ) da entrada file . Por fim, remova as quebras de linha tr e imprima as correspondências.

pattern=$(sort -k1,2 -u < file | cut -d' ' -f1-2) 
while read -r line
do
 collect=$(sed -n 's/^'"$line"'//p' file | tr '\n' ' ')
 echo "$line $collect"
done <<<"$pattern"
    
por 10.05.2017 / 05:23
0
sed -E '
   :loop
      $!N
      s/^(((\S+\s+){2}).*)\n/ /
   tloop
   P;D
' yourfile

Resultados

A 123 BC DD TT
B 456 AA RR
C 789 EE

Explicação

Nós configuramos um do-while loop e acrescentamos a próxima linha ao pattern space e depois disso comparamos os dois primeiros campos com o mesmo depois do newline no espaço do padrão. Se eles puderem ser removidos do espaço de padrões, então repetiremos o loop e sairemos do loop na impossibilidade de fazê-lo. Nesse momento, imprimimos o espaço do padrão até a primeira nova linha. E remova essa parte e volte para mais.

    
por 10.05.2017 / 08:56