Cómo extraer grupos de una columna basándose en la combinación única de otras dos columnas

Cómo extraer grupos de una columna basándose en la combinación única de otras dos columnas

Tengo datos como este:

Sample_1    Apples  Red
Sample_2    Apples  Red
Sample_3    Apples  Red
Sample_4    Apples  Red
Sample_5    Apples  Red
Sample_6    Apples  Green
Sample_7    Apples  Green
Sample_8    Apples  Green
Sample_9    Apples  Green
Sample_10   Apples  Green
Sample_11   Apples  Yellow
Sample_12   Apples  Yellow
Sample_13   Apples  Yellow
Sample_14   Apples  Yellow
Sample_15   Apples  Yellow

¿Cómo puedo extraer de forma iterativa las muestras de la primera columna en función de la combinación de los grupos formados a partir de las otras dos columnas, de modo que obtenga las muestras 1-5, 6-10 y 11-15?

Lo que finalmente quiero hacer es extraer las listas de muestras (como los grupos anteriores) como entrada para otro comando, por ejemplo:

comm -23 <(sort <all_samples.txt>) <(sort <[input from above]>) > <difference.txt>

Yo he tratado:

awk '{print $2"\t"$3}' <file.txt> | uniq

Para obtener las combinaciones únicas de la segunda y tercera columnas, pero parece que no puedo hacer nada con esto, especialmente tirar de la primera columna, que es lo que necesito.

Respuesta1

¿Es esto lo que estás intentando hacer?

$ awk '{vals[$2 FS $3] = vals[$2 FS $3] OFS $1} END{for (key in vals) print key vals[key]}' file
Apples Red Sample_1 Sample_2 Sample_3 Sample_4 Sample_5
Apples Green Sample_6 Sample_7 Sample_8 Sample_9 Sample_10
Apples Yellow Sample_11 Sample_12 Sample_13 Sample_14 Sample_15

o tal vez esto?

$ awk -v fruit='Apples' -v color='Green' '($2==fruit) && ($3==color)' file
Sample_6    Apples  Green
Sample_7    Apples  Green
Sample_8    Apples  Green
Sample_9    Apples  Green
Sample_10   Apples  Green

Respuesta2

Este es un ejemplo simple de un script gawk que analiza su entrada y genera una transposición de los datos que parece adecuada a sus necesidades.

#!/usr/bin/gawk -f

# Checks if type (column 2) or subtype (column 3) are 
# different from previous line.
(type != $2) || (subtype != $3) {
    # Prints the start of a new output line.
    # The NR!=1 check avoids that a new line is 
    # printed on the first line.
    printf("%s%s\t%s\t", (NR!=1)?"\n":"", $2, $3);
    type=$2;
    subtype=$3
}
{
    # Prints all sample (column 1) values on the 
    # current output line.
    printf("\"%s\" ", $1);
}
# prints a new line at the end of file.
END{
    print "";
}

La salida de script.awk < input.lstlo siguiente. ¿Dónde script.awkestá el script anterior y input.lstes su ejemplo de entrada?

Apples  Red     "Sample_1" "Sample_2" "Sample_3" "Sample_4" "Sample_5" 
Apples  Green   "Sample_6" "Sample_7" "Sample_8" "Sample_9" "Sample_10" 
Apples  Yellow  "Sample_11" "Sample_12" "Sample_13" "Sample_14" "Sample_15" 

La salida del script se puede manipular fácilmente de la siguiente manera.

script.awk < input.lst | while read TYPE SUBTYPE LIST
do 
    echo $TYPE
    echo $SUBTYPE
    for ITEM in $LIST
    do  
        echo execute some command on $ITEM where type is $TYPE and subtype is $SUBTYPE
    done 
done

Tenga en cuenta que este script es muy aproximado. Por ejemplo, no hay manejo de errores ni verificación de espacios en blanco o caracteres especiales en la entrada.

Respuesta3

Probé con el siguiente script y funcionó bien

for i in "Apples"; do for j in "Red" "Green" "Yellow"; do awk -v i="$i" -v j="$j" 'BEGIN{print "Below are table contains" " " i " and " " " j}$2==i && $NF==j{print $0}' filename; done; done

producción

Below are table contains Apples and  Red
Sample_1    Apples  Red
Sample_2    Apples  Red
Sample_3    Apples  Red
Sample_4    Apples  Red
Sample_5    Apples  Red
Below are table contains Apples and  Green
Sample_6    Apples  Green
Sample_7    Apples  Green
Sample_8    Apples  Green
Sample_9    Apples  Green
Sample_10   Apples  Green
Below are table contains Apples and  Yellow
Sample_11   Apples  Yellow
Sample_12   Apples  Yellow
Sample_13   Apples  Yellow
Sample_14   Apples  Yellow
Sample_15   Apples  Yellow

información relacionada