用于删除重复值并将值分配给变量的脚本

用于删除重复值并将值分配给变量的脚本

有一个如下文件需要过滤重复值并将值分配给变量

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 列中的唯一值调用的数组(减去文字 string port,因为如果保留它可能不会为您排序到顶部,并且显然您无论如何都希望将输出文件中的第一个字母大写。

然后我们创建一个输出文件,顶部包含该单词Port,然后将输入文件中的所有唯一端口值添加到新的输出文件中。

然后我们循环遍历ports数组中的每个值,并将变量abc分别设置为第一、第二和第三列。 awk在这里使用是因为我不确定您的端口号是否可以是多位数字,因此此方法可以以任何一种方式处理它,但如果它们始终是单个数字,您可以使用 shell 参数扩展,这应该会更快一些:

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

相关内容