
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