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
对于grep
and 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