Estoy tratando de filtrar un archivo de texto con columnas en función de dos condiciones. Debido al tamaño del archivo, no puedo usar los números de las columnas (ya que hay miles y no están numerados), pero necesito usar los nombres de las columnas. He buscado e intentado encontrar varias formas de hacerlo, pero no se devuelve nada a la línea de comandos.
Aquí hay algunas cosas que he probado:
awk '($colname1==2 && $colname2==1) { count++ } END { print count }' file.txt para filtrar las columnas según sus condiciones
y head -1 file.txt | tr '\t' | cat -n | grep "COLNAME para intentar devolver el posible número de columna relacionado con la columna.
Un archivo de ejemplo sería:
ID ad bd 1 a fire 2 b air 3 c water 4 c water 5 d water 6 c earthLa salida sería: 2 (recuento de ad=c y bd=agua)
con su archivo de entrada y las condiciones implícitas esto debería funcionar
$ awk -v c1='ad' -v c2='bd' 'NR==1{n=split($0,h); for(i=1;i<=n;i++) col[h[i]]=i} $col[c1]=="c" && $col[c2]=="water"{count++} END{print count+0}' file 2o también puede reemplazar c1 y c2 con los valores en el script.
para encontrar los índices de columna que puede ejecutar
$ awk -v cols='ad bd' 'BEGIN{n=split(cols,c); for(i=1;i<=n;i++) colmap[c[i]]} NR==1{for(i=1;i<=NF;i++) if($i in colmap) print $i,i; exit}' file ad 2 bd 3o tal vez con esta cadena
$ sed 1q file | tr -s ' ' \\n | nl | grep -E 'ad|bd' 2 ad 3 bdaunque puede tener falsos positivos debido a la coincidencia de expresiones regulares ...
Puedes reescribir el awk para que sea más conciso.
$ awk -v cols='ad bd' '{while(++i<=NF) if(FS cols FS ~ FS $i FS) print $i,i; exit}' file ad 2 bd 3Como mencioné en un comentario anterior, la respuesta en https://unix.stackexchange.com/a/359699/133219 muestra cómo hacer esto:
awk -F'\t' ' NR==1 { for (i=1; i<=NF; i++) { f[$i] = i } } ($(f["ad"]) == "c") && ($(f["bd"]) == "water") { cnt++ } END { print cnt+0 } ' file 2 Supongo que su entrada está separada por tabulaciones debido al tr '\t' en el comando en su pregunta que parece que está tratando de convertir tabulaciones en líneas nuevas para convertir nombres de columna en números. Si me equivoco y solo están separados por cadenas de espacios en blanco, elimine -F'\t' de lo anterior.
Use el kit de herramientas de miller para manipular archivos delimitados por tabuladores usando nombres de columna. A continuación se muestra una línea que filtra un archivo delimitado por tabulaciones (el delimitador se especifica usando --tsv ) y escribe los resultados en STDOUT junto con el encabezado. El encabezado se elimina con tail y las líneas se cuentan con wc .
mlr --tsv filter '$ad == "c" && $bd == "water"' file.txt | tail -n +2 | wc -lHuellas dactilares:
2VER TAMBIÉN:
Tenga en cuenta que miller se puede instalar fácilmente, por ejemplo, usando conda , así:
conda create --name miller miller