중복된 값을 필터링하고 변수에 값을 할당해야 하는 아래와 같은 파일이 있습니다.
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
그런 다음 배열의 각 값을 반복 하고 변수 a
, b
를 c
첫 번째, 두 번째 및 세 번째 열에 각각 설정합니다. awk
포트 번호가 여러 자리일 수 있는지 확실하지 않기 때문에 여기서 사용하여 이 방법으로 어느 쪽이든 처리할 수 있지만 항상 한 자리인 경우 더 빠른 셸 매개 변수 확장을 사용할 수 있습니다.
a=${p:0:1}
b=${p:2:1}
c=${p:4:1}