有一个如下文件需要过滤重复值并将值分配给变量
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
数组中的每个值,并将变量a
、b
和c
分别设置为第一、第二和第三列。 awk
在这里使用是因为我不确定您的端口号是否可以是多位数字,因此此方法可以以任何一种方式处理它,但如果它们始终是单个数字,您可以使用 shell 参数扩展,这应该会更快一些:
a=${p:0:1}
b=${p:2:1}
c=${p:4:1}