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

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

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

列を一致させ、1002番目の列からテキストを抽出します。

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

2番目の列を一致させ、1002番目の列のテキストを取得します。

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

どちらも肯定的な振り返りを使用します。と表示されます\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

関連情報