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

2

cat file_1 :

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

meu último arquivo final deve ter apenas 2 colunas que contenham o padrão '100'

cat final_file :

name 
age
yak
    
por prince 987 23.09.2016 / 10:56

4 respostas

3

Como o val0x00ff sugere, awk pode cobrir isso

Isso corresponderia a 100 em qualquer lugar no campo 2, por exemplo "foo100bar" corresponderia.

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

Isso só corresponderia a 100 no campo 2.

awk '$2 == "100" { print $NF }' file_1 >final_file
    
por 23.09.2016 / 12:17
1

Em um caso geral, eu faria algo como seguir o 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"  

Dessa maneira, você pode selecionar a coluna que deve corresponder à pattern usando a variável matching_col . Em seguida, a coluna a ser impressa é calculada como printing_col=matching_column+2 . E do que você pode imprimir o valor especificado no campo printing_column usando $printing_col .

    
por 23.09.2016 / 12:33
0

Com grep e pcre , assume o espaço 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

Correspondendo 100 em qualquer coluna e extrair texto da segunda coluna depois disso

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

Correspondendo 100 na segunda coluna e depois obtendo o texto da segunda coluna depois disso

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

Ambos usam lookbehind positivo - marcado por \K . O primeiro usa \b para marcar o limite de palavras (para evitar correspondências como 1100 )

Adicione > final_file ao comando para salvar a saída

    
por 23.09.2016 / 18:22
0

Eu 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].*$\)//p' original_file > newfile

Qual você fica ...

cat newfile 
name
age
yak
    
por 23.09.2016 / 18:46