Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

267
Views
Filtrado en una condición usando los nombres de las columnas y no los números

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 earth

La salida sería: 2 (recuento de ad=c y bd=agua)

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

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 2

o 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 3

o tal vez con esta cadena

 $ sed 1q file | tr -s ' ' \\n | nl | grep -E 'ad|bd' 2 ad 3 bd

aunque 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 3
over 4 years ago · Santiago Trujillo Report

0

Como 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.

over 4 years ago · Santiago Trujillo Report

0

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 -l

Huellas dactilares:

 2

VER TAMBIÉN:

manuales de miller

Tenga en cuenta que miller se puede instalar fácilmente, por ejemplo, usando conda , así:

 conda create --name miller miller
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!