중복된 값을 제거하고 변수에 값을 할당하는 스크립트

중복된 값을 제거하고 변수에 값을 할당하는 스크립트

중복된 값을 필터링하고 변수에 값을 할당해야 하는 아래와 같은 파일이 있습니다.

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, bc첫 번째, 두 번째 및 세 번째 열에 각각 설정합니다. awk포트 번호가 여러 자리일 수 있는지 확실하지 않기 때문에 여기서 사용하여 이 방법으로 어느 쪽이든 처리할 수 있지만 항상 한 자리인 경우 더 빠른 셸 매개 변수 확장을 사용할 수 있습니다.

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

관련 정보