
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, awk
pode 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 pattern
usando 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 grep
e 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 100
em 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 100
na 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 \b
para marcar o limite do Word (para evitar correspondências como 1100
)
Adicionar > final_file
ao 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