如何选择找到模式后的第二列,模式为“100”

如何选择找到模式后的第二列,模式为“100”

cat file_1

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

我的最终文件应该只有第二列,其中包含模式“100”

cat final_file

name 
age
yak

答案1

正如 val0x00ff 所建议的,awk可以覆盖这个

这将匹配字段 2 中任何位置的 100,例如“foo100bar”将匹配。

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

这只会匹配字段 2 中的 100。

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

对于grepand 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第二列,然后获取第二列文本

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

两者都使用积极的lookbehind - 标记为\K。第一个用于\b标记单词边界(以避免像 这样的匹配1100

添加> final_file用于保存输出的命令

答案4

我认为上面的 steves awk 解决方案是最好的,但既然我们已经这样做了,这里有一个 sed 的变体

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

这让你...

cat newfile 
name
age
yak

相关内容