
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
上記のスティーブのawkソリューションが最善だと思いますが、せっかくなのでsedを使ったバージョンも紹介します。
sed -n 's/.* 100 .* \([a-z].*$\)/\1/p' original_file > newfile
それは...
cat newfile
name
age
yak