処理されるデータは特定のパターンに従います。この場合、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'
-n
p
これは、式に一致する文字列のみを印刷することを意味します。
この式は最後の項目まで削除し、.
最初の項目より前のすべての項目を削除します-
。
だから:
% 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