パイプラインコマンドで条件文を使用する方法は? [閉鎖]

パイプラインコマンドで条件文を使用する方法は? [閉鎖]

処理されるデータは特定のパターンに従います。この場合、3番目の列のすべての文字を区切ります。「-」ただし、列に区切り文字がある場合にのみ該当します。それ以外の場合は何も返すべきではありません。

eval $A=$(echo $1 | awk -F"." '{print $3}' | cut -d\- -f2-)

最初のawk文は文字列を次のように分割します。

111
222
333-ab3-On21-2

このcutコマンドは、最初の「-」の後の文字を印刷します。

文字列1 111.2222.333-ab3-On21-2目的の結果を返します。

ab3-On21-2

文字列2 111.2222.334不要な結果を返します。

333

文字列の最後の部分には区切り文字はありません"-"。この場合、このコードを0または ""を返すように変更するにはどうすればよいですか?

ベストアンサー1

あなたの声明に条件がないので、「条件」をどこで得たのかわかりません。awk -F- {print}有用な作業は実行せず、入力を出力に渡します。

ただし、式を使用してsedパイプライン全体を簡素化したい操作を実行できます。

sed -n 's/.*\.[^-]*-\(.*\)/\1/p'

-npこれは、式に一致する文字列のみを印刷することを意味します。

この式は最後の項目まで削除し、.最初の項目より前のすべての項目を削除します-

だから:

% echo 111.2222.333-ab3-On21-2 | sed -n 's/.*\.[^-]*-\(.*\)/\1/p'
ab3-On21-2
% echo 111.2222.333 | sed -n 's/.*\.[^-]*-\(.*\)/\1/p'           
% 

入力がより複雑な場合(たとえば、4つの.区切られたフィールド)、スキーマはよりスマートになる必要があるかもしれません。

sed -n 's/.*\.[^-]*-\([^\.]*\).*/\1/p'

例えば

% echo 111.2222.333-ab3-On21-2.999 | sed -n 's/.*\.[^-]*-\([^\.]*\).*/\1/p'
ab3-On21-2

おすすめ記事