如何選擇找到模式後的第二列,模式為“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

相關內容