Como selecionar a 2ª coluna após o padrão encontrado, os padrões são '100'

Como selecionar a 2ª coluna após o padrão encontrado, os padrões são '100'

cat file_1:

height 100  3 name
gray   125  8 yellow
base   100  5 age
red    455  9 tea
level  100  7 yak

meu arquivo final final deve ter apenas as segundas colunas que contêm o padrão '100'

cat final_file:

name 
age
yak

Responder1

Como sugere val0x00ff, awkpode cobrir isso

Isto corresponderia a 100 em qualquer lugar do campo 2, por exemplo, "foo100bar" corresponderia.

awk '$2 ~ 100 {print $NF}' file_1 >final_file

Isso corresponderia apenas a 100 no campo 2.

awk '$2 == "100" { print $NF }' file_1 >final_file

Responder2

Em um caso geral, eu faria algo como o seguinte código:

#!/bin/bash
matching_column=2  
filename="def"
awk -v matching_col=${matching_column}\
    -v printing_col=$((matching_column+2))\
    '$matching_col ~ 100 {printf "%s\n", $printing_col}' "$filename"  

Desta forma você pode selecionar a coluna que deve corresponder patternusando a variável matching_col. Então, a coluna a ser impressa é calculada como printing_col=matching_column+2. E você pode imprimir o valor especificado no campo print_column usando $printing_col.

Responder3

Com grepe pcre, assume espaços em branco como delimitadores de coluna

$ cat ip.txt 
height 100  3 name
gray   125  8 yellow
base   100  5 age
red    455  9 tea
level  100  7 yak

Correspondência 100em qualquer coluna e extração do texto da segunda coluna depois disso

$ grep -oP '\b100\s+\S+\s+\K\S+' ip.txt 
name
age
yak

Correspondendo 100na 2ª coluna e obtendo o texto da 2ª coluna depois disso

$ grep -oP '^\S+\s+100\s+\S+\s+\K\S+' ip.txt 
name
age
yak

Ambos fazem uso de lookbehind positivo - marcado por \K. O primeiro usa \bpara marcar o limite do Word (para evitar correspondências como 1100)

Adicionar > final_fileao comando para salvar a saída

Responder4

Acho que a solução steves awk acima é a melhor, mas já que estamos nisso, aqui está uma variante com sed

sed -n 's/.* 100 .* \([a-z].*$\)/\1/p' original_file > newfile

O que te leva...

cat newfile 
name
age
yak

informação relacionada