
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