パターンが見つかった後の2番目の列を選択する方法、パターンは「100」です

パターンが見つかった後の2番目の列を選択する方法、パターンは「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」を含む2番目の列のみが必要です。

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と を使用すると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、その後2列目からテキストを抽出します

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

2列目で一致し100、その後2列目のテキストを取得します

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

どちらも でマークされた肯定的な後読みを使用します\K。最初のものは のような一致を避けるために単語の境界をマークするために を使用します\b1100

> final_file出力を保存するためのコマンドに追加

答え4

上記のスティーブのawkソリューションが最善だと思いますが、せっかくなのでsedを使ったバージョンも紹介します。

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

それは...

cat newfile 
name
age
yak

関連情報