
重複した値をフィルタリングし、変数に値を割り当てる必要がある以下のファイルがあります。
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
番目b
、c
3番目の列にそれぞれ設定します。 awk
ポート番号が複数桁であるかどうかわからないため、ここでこれを使用してどちらかを処理できますが、常に1桁の場合は、より高速なシェルパラメータ拡張を使用できます。
a=${p:0:1}
b=${p:2:1}
c=${p:4:1}