重複した値を削除して変数に値を割り当てるスクリプト

重複した値を削除して変数に値を割り当てるスクリプト

重複した値をフィルタリングし、変数に値を割り当てる必要がある以下のファイルがあります。

name    port
xyc    3:4:7
sdf    5:5:5
sft    5:5:5
sfg    3:4:7
szd    1:2:3

結果ファイル

Port
3:4:7
5:5:5
1:2:3

次の値は、次のようにループに割り当てる必要があります。

First Iteration :  a=4 b= 4 c=7
Second Iteration   a=5 b=5 c=5
Thirtd iteration   a=1 b=2 c=3

ベストアンサー1

私は次の方法でこれを達成できました。

#!/bin/bash

input=~/tmp/input
output=~/tmp/output
ports=($(awk '$2 !~ "port"{print $2}' input | sort -u))

printf '%s\n' 'Port' > "$output"
printf '%s\n' "${ports[@]}" >> "$output"

for p in "${ports[@]}"; do
    a=$(awk -F\: '{print $1}' <<<"$p")
    b=$(awk -F\: '{print $2}' <<<"$p")
    c=$(awk -F\: '{print $3}' <<<"$p")
    printf 'a=%s, b=%s, c=%s\n' "$a" "$b" "$c"
done

portsこれにより、列2の一意の値(リテラル文字列を除く)として呼び出される配列が生成されます。portなぜなら、それを維持すると、一番上に並べ替えられない可能性があり、明らかに出力ファイルの最初の文字を大文字にしたいからです。

次に、上部にその単語を含む出力ファイルを作成し、Port入力ファイルのすべての一意のポート値を新しい出力ファイルに追加します。

ports次に、配列の各値を繰り返し、変数、を最初、2a番目bc3番目の列にそれぞれ設定します。 awkポート番号が複数桁であるかどうかわからないため、ここでこれを使用してどちらかを処理できますが、常に1桁の場合は、より高速なシェルパラメータ拡張を使用できます。

a=${p:0:1}
b=${p:2:1}
c=${p:4:1}

おすすめ記事