Как выбрать 2-й столбец после найденного шаблона, шаблоны - это «100»

Как выбрать 2-й столбец после найденного шаблона, шаблоны - это «100»

cat file_1:

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

Мой окончательный файл должен содержать только 2 столбца, которые содержат шаблон «100»

cat final_file:

name 
age
yak

решение1

Как предполагает val0x00ff, awkможет покрыть это

Это будет соответствовать 100 в любом месте поля 2, например, будет соответствовать "foo100bar".

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

Это будет соответствовать только значению 100, находящемуся в поле 2.

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

решение2

В общем случае я бы сделал что-то вроде следующего кода:

#!/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"  

Таким образом, вы можете выбрать столбец, который должен соответствовать, patternиспользуя переменную matching_col. Затем столбец для печати вычисляется как printing_col=matching_column+2. И затем вы можете распечатать значение, указанное в поле printing_column, используя $printing_col.

решение3

С grepи pcre, предполагается, что пробелы являются разделителями столбцов.

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

Сопоставление 100в любом столбце и извлечение текста из второго столбца после него

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

Сопоставление 100во 2-м столбце и последующее получение текста во 2-м столбце

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

Оба используют положительный просмотр назад - отмеченный \K. Первый использует \bдля обозначения границы слова (чтобы избежать совпадений типа 1100)

Добавить > final_fileк команде сохранения вывода

решение4

Я думаю, что решение Стива awk выше — лучшее, но раз уж мы за него взялись, вот вариант с sed

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

Что даст вам...

cat newfile 
name
age
yak

Связанный контент