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
。最初のものは\b
単語の境界を表示するために使用されます(このような一致を避けるため1100
)。
> final_file
出力保存コマンドの追加
答え4
上記のStevesのawkソリューションは最高だと思いますが、今やったので、ここにsedバリエーションがあります。
sed -n 's/.* 100 .* \([a-z].*$\)/\1/p' original_file > newfile
これにより、次のことができます。
cat newfile
name
age
yak