2番目のフィールドの重複値に基づいてフィールドレコードに文字を追加する

2番目のフィールドの重複値に基づいてフィールドレコードに文字を追加する

この入力があります。

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

おすすめ記事