예를 들어, 디렉토리에 n개의 파일이 있다고 가정해 보겠습니다.
a
b
c
이러한 파일의 쌍별 조합(비지정)을 함수에 어떻게 전달할 수 있나요?
예상 출력은 다음과 같습니다.
a-b
a-c
b-c
이런 식으로 다음과 같은 함수에 전달될 수 있습니다.
fn -file1 a -file2 b
fn -file1 a -file2 c
...
이것이 내가 지금 시도하는 것입니다.
for i in *.txt
do
for j in *.txt
do
if [ "$i" != "$j" ]
then
echo "Pairs $i and $j"
fi
done
done
산출
Pairs a.txt and b.txt
Pairs a.txt and c.txt
Pairs b.txt and a.txt
Pairs b.txt and c.txt
Pairs c.txt and a.txt
Pairs c.txt and b.txt
나는 여전히 중복된 파일을 가지고 있고(ab는 ba와 동일합니다) 아마도 이 작업을 수행하는 더 좋은 방법이 있을 것이라고 생각했습니다.
답변1
파일 이름을 배열에 넣고 두 개의 루프를 통해 수동으로 실행하십시오.
다음과 같은 경우에는 하나의 일치 항목만 얻을 수 있습니다.j < 나는어디나그리고제이외부 루프와 내부 루프에서 각각 사용되는 인덱스입니다.
$ touch a b c d
$ f=(*)
$ for ((i = 0; i < ${#f[@]}; i++)); do
for ((j = i + 1; j < ${#f[@]}; j++)); do
echo "${f[i]} - ${f[j]}";
done;
done
a - b
a - c
a - d
b - c
b - d
c - d
답변2
귀하의 스크립트는 매우 유사하지만 중복 항목을 제거하려고 합니다. 즉, ab는 ba의 중복 항목으로 처리됩니다.
이를 처리하기 위해 불평등을 사용할 수 있습니다. 파일 이름은 첫 번째 파일이 두 번째 파일보다 알파벳순으로 앞에 있는 경우에만 표시됩니다. 이렇게 하면 게임당 하나만 있을 수 있습니다.
for i in *.txt
do
for j in *.txt
do
if [ "$i" \< "$j" ]
then
echo "Pairs $i and $j"
fi
done
done
이것은 출력을 제공합니다
Pairs a.txt and b.txt
Pairs a.txt and c.txt
Pairs b.txt and c.txt
이는 효율적인 알고리즘은 아니지만(O(n^2)) 귀하의 요구에 충분할 수 있습니다.
답변3
공백 없는 파일 이름에 대한 팁 join
:
파일 예시 목록:
$ ls *.json | head -4
1.json
2.json
comp.json
conf.json
$ join -j9999 -o1.1,2.1 <(ls *.json | head -4) <(ls *.json | head -4) | awk '$1 != $2'
1.json 2.json
1.json comp.json
1.json conf.json
2.json 1.json
2.json comp.json
2.json conf.json
comp.json 1.json
comp.json 2.json
comp.json conf.json
conf.json 1.json
conf.json 2.json
conf.json comp.json
-j
옵션은 조인할 공개 필드 위치를 가리키지만 다음-j9999
과 같은 혼합 조인을 트리거합니다.데카르트제품.
답변4
Perl 모듈을 사용하면 Alogithm::Combinatorics
알고리즘을 직접 설계하는 것을 피할 수 있습니다.
perl -MAlgorithm::Combinatorics=combinations -e '
if ((@files = <*.txt>) >= 2) {
for (combinations(\@files, 2)) {
system "cmd", "-file1", $_->[0], "-file2", $_->[1];
}
} else {
die "Not enough txt files in the current working directory\n";
}'
perldoc Algorithm::Combinatorics
모듈이 수행할 수 있는 자세한 내용과 기타 작업은 리소스를 참조하세요 .