次の形式のタブで区切られた列を含むファイルがあります。
AAA BBB;CCC;DDD;E=10;F=20 GGG
XXX YYY;ZZZ;DDD;E=50;F=40 PPP
E
UNIXコマンド(または)を使用して値を印刷する必要があります。F
10
50
答え1
cut
4番目のフィールドを取得してsed
等号の前にあるすべての項目を削除するには、次の手順を実行します。
cut -f 4 -d\; | sed 's/.*=//'
ただし、例の行では、フィールドをセミコロンで区切っていますが、タブで区切られたフィールドに言及しました。
答え2
GNU grepはPCRE(-P
)モードを使用します。
$ grep -Po '(?<=E=)\d+' file
10
50
または
$ grep -Po '(?<=F=)\d+' file
20
40
答え3
$ echo 'AAA BBB;CCC;DDD;E=10;F=20 GGG' | awk -F';' '{ print $4 }' | awk -F= '{ print $2 }'
10
$ echo 'XXX YYY;ZZZ;DDD;E=50;F=40 PPP' | awk -F';' '{ print $4 }' | awk -F= '{ print $2 }'
50
それとももっと簡単です:
$ echo 'XXX YYY;ZZZ;DDD;E=50;F=40 PPP' | awk 'match($0, /=[0-9]+/) { print substr($0, RSTART + 1, RLENGTH - 1) }'
50
$ echo 'AAA BBB;CCC;DDD;E=10;F=20 GGG' | awk 'match($0, /=[0-9]+/) { print substr($0, RSTART + 1, RLENGTH - 1) }'
10
答え4
行の残りの部分に興味がない場合、その行を見つける、またはその行E=
がF=
表示されている場所を見つけるには、次のようにしますsed
。
sed -e 's/.*E=//' -e 's/;.*//'
これにより、 ''の前のすべての項目( ''を含むE=
)が削除され、 '';
とそれ以降のすべての項目が削除されます。各行は次のように仮定します。する含んでいる" E=
"。
フィールドが常に特定の列(タブやセミコロンなどで区切られた列)に表示されることがわかっている場合は、最初またはそれに対応する項目を使用して列を抽出し、その部分を値から分離することをお勧めしE=
ます。 @berndbauschの答えを使用してこれを行うか、別の列を想定する2番目の呼び出しを使用できます。cut
E=
sed
cut
=