생성되어 변수에 추가되는 문자열 목록이 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
사용하고 있으므로 행별로 처리한다고 가정합니다 .)sort
uniq
comm
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
사이의 중복을 제거해야 하므로 더 간단한 접근 방식을 사용할 수 있습니다.t
nnpp
echo "$t" >t
echo "$nnpp" >nnpp
sort -u -o psl t nnpp
sort
플래그 는 -u
piping 과 동일하며 정렬된 출력을 쓸 파일 이름을 지정하는 플래그를 전달할 uniq
수 있습니다 .sort
-o