この入力があります。
array='2 0.00000 -1.45191
6 0.81778 -0.63413
10 0.85020 -0.60170
8 1.40260 -0.04931
22 3.25781 1.80590
20 4.32051 2.86860
6 0.00000 -0.93906
18 0.07618 -0.86288
8 0.36922 -0.56984
12 0.71195 -0.22711
16 0.88517 -0.05389'
同じ配列をコピーしようとしていますが、
2 0.00000 -1.45191
6 0.81778 -0.63413
10 0.85020 -0.60170
8 1.40260 -0.04931
22 3.25781 1.80590
20 4.32051 2.86860
6- 0.00000 -0.93906
18- 0.07618 -0.86288
8- 0.36922 -0.56984
12- 0.71195 -0.22711
16- 0.88517 -0.05389
違いは、$1
最初のフィールドの2番目の部分0.00000
には、2番目のフィールドの2番目の値をマーカーとして使用して接尾辞が付けられることです。$2
このコマンドが利用可能であればawk
うれしいです。
ベストアンサー1
あなたの例に基づいて、現れる必要なのは、2番目の列に0.00000
文字列(または数値)の発生回数を記録し、数が2に達したときに最初の列の値に追加することです。0
-
printf '%s\n' "$array" | awk '$2 == "0.00000" {++ind} ind == 2 {$1 = $1"-"} 1'
ただし、これは条件を満たすレコードの列区切り文字をデフォルト(単一スペース)出力区切り文字に置き換えます。もし入力区切り文字は一連の空白文字なので、ソートを維持する1つの方法は、最初の空白文字を次のように置き換えることです-
。
$ printf '%s\n' "$array" | awk '$2 == "0.00000" {++ind} ind == 2 {sub(/ /,"-")} 1'
2 0.00000 -1.45191
6 0.81778 -0.63413
10 0.85020 -0.60170
8 1.40260 -0.04931
22 3.25781 1.80590
20 4.32051 2.86860
6- 0.00000 -0.93906
18- 0.07618 -0.86288
8- 0.36922 -0.56984
12- 0.71195 -0.22711
16- 0.88517 -0.05389