Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

272
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda