문자열 목록 전체에서 분리하는 방법

문자열 목록 전체에서 분리하는 방법

생성되어 변수에 추가되는 문자열 목록이 2개 있습니다 . $t그런 $nnpp다음 comm 명령을 사용하여 비교합니다.

pcr=$(comm -13 <(echo “$t” | sort) <(echo “$nnpp” | sort))

그런 다음 차이점을 기본 파일에 다시 추가하고 정렬합니다.

psl=$(sort <(echo $t) <(echo $pcr) | uniq)

이제 내가 만든 새 목록을 반복하려고 하면 $psl목록이 하나로 처리되어 첫 번째 반복에서 모든 것을 가져옵니다. 반복할 수 있도록 어떻게 분리할 수 있나요?

나는 성공하지 않고 이것을 시도했습니다.

for e in “${psl[@]}”
then
     echo $e
done

궁금하신 분들을 위해 스크립트 시작 부분에도 이 내용이 있습니다.

IFS=$’\n’
IFS=$’\t’

답변1

당신이 겪고 있는 문제의 일부는 줄에 따옴표가 부족하여 $t내용이 한 줄로 만들어지고 많은 단어가 포함된 두 개의 긴 줄이 $pcr된다는 것입니다 .psl

psl=$(sort <(echo $t) <(echo $pcr) | uniq)

간단한 첫 번째 수정은 다음과 같습니다.

psl=$(sort <(echo "$t") <(echo "$pcr") | uniq)

하지만 그런 다음 행별로 반복해야 합니다 . ( 및 같은 도구를 $psl사용하고 있으므로 행별로 처리한다고 가정합니다 .)sortuniqcomm

while read -r e ; do
    echo "$e"
done <<<"$psl"

임시 파일을 사용하면 실제로 훨씬 쉬워집니다.

echo "$t" | sort >t.sorted
echo "$nnpp" | sort >nnpp.sorted
comm -13 t.sorted nnpp.sorted >pcr
sort t.sorted pcr | uniq >psl
while read -r e ; do
    echo "$e"
done <psl

그런데, pcr단순히 고유한 행이 있고 이를 nnpp사용하면 및 uniq사이의 중복을 제거해야 하므로 더 간단한 접근 방식을 사용할 수 있습니다.tnnpp

echo "$t" >t
echo "$nnpp" >nnpp
sort -u -o psl t nnpp

sort플래그 는 -upiping 과 동일하며 정렬된 출력을 쓸 파일 이름을 지정하는 플래그를 전달할 uniq수 있습니다 .sort-o

관련 정보