file1, file2 등 여러 개의 파일이 있습니다. 각 파일에는 한 줄에 한 단어가 있습니다. 예를 들면 다음과 같습니다.
file1 file2 file3
one four six
two five
three
내가 원하는 것은 가능한 모든 순열(반복 없이)에서 새 파일 4로 쌍으로 결합하는 것입니다. 좋다
onetwo
onethree
onefour
onefive
...
twothree
...
onefour
...
fourone
...
Linux 명령을 사용하여 이것이 어떻게 가능합니까?
답변1
루비는 이런 종류의 작업에 적합한 간결한 언어입니다.
ruby -e '
words = ARGV.collect {|fname| File.readlines(fname)}.flatten.map(&:chomp)
words.combination(2).each {|pair| puts pair.join("")}
' file[123] > file4
onetwo
onethree
onefour
onefive
onesix
twothree
twofour
twofive
twosix
threefour
threefive
threesix
fourfive
foursix
fivesix
맞습니다. combination
"onetwo"가 제공되었지만 "twoone"이 누락되었습니다. 좋은 것들이 있어요permutation
ruby -e '
words = ARGV.collect {|fname| File.readlines(fname)}.flatten.map(&:chomp)
words.permutation(2).each {|pair| puts pair.join("")}
' file{1,2,3}
onetwo
onethree
onefour
onefive
onesix
twoone
twothree
twofour
twofive
twosix
threeone
threetwo
threefour
threefive
threesix
fourone
fourtwo
fourthree
fourfive
foursix
fiveone
fivetwo
fivethree
fivefour
fivesix
sixone
sixtwo
sixthree
sixfour
sixfive
답변2
입력 파일의 전체 크기가 getconf ARG_MAX
(즉, 최대 명령줄 길이)보다 작다고 가정하면 다음과 같이 작동합니다.
set -- $( cat file[123] )
for f in $@ ; do
for g in $@ ; do
[ "$f" != "$g" ] && echo $f$g
done
done > file4
cat file4
산출:
onetwo
onethree
onefour
onefive
onesix
twoone
twothree
twofour
twofive
twosix
threeone
threetwo
threefour
threefive
threesix
fourone
fourtwo
fourthree
fourfive
foursix
fiveone
fivetwo
fivethree
fivefour
fivesix
sixone
sixtwo
sixthree
sixfour
sixfive
(OP의 설명에 따르면 위의 내용은 정확합니다.반복되지 않는 배열. 이전 초안 보기 반복되지 않는 조합.)
답변3
일방 python
통행:
import fileinput
from itertools import permutations
from contextlib import closing
with closing(fileinput.input(['file1', 'file2', 'file3'])) as f:
for x, y in permutations(f, 2):
print '{}{}'.format(x.rstrip('\n'), y.rstrip('\n'))
onetwo
onethree
onefour
onefive
onesix
twoone
twothree
twofour
twofive
twosix
threeone
threetwo
threefour
threefive
threesix
fourone
fourtwo
fourthree
fourfive
foursix
fiveone
fivetwo
fivethree
fivefour
fivesix
sixone
sixtwo
sixthree
sixfour
sixfive
답변4
TXR 리스프:
워밍업: 먼저 데이터 구조를 가져옵니다.
$ txr -p '(comb (get-lines (open-files *args*)) 2)' file1 file2 file3
(("one" "two") ("one" "three") ("one" "four") ("one" "five") ("one" "six")
("two" "three") ("two" "four") ("two" "five") ("two" "six") ("three" "four")
("three" "five") ("three" "six") ("four" "five") ("four" "six")
("five" "six"))
이제 출력 형식을 올바르게 설정하는 것이 문제입니다. 쌍을 함께 연결한 다음 tprint
(암시적으로 options 를 통해 -t
) 사용하면 문제가 해결됩니다.
먼저 매핑을 통해 연결합니다 cat-str
.
$ txr -p '[mapcar cat-str (comb (get-lines (open-files *args*)) 2)]' file1 file2 file3
("onetwo" "onethree" "onefour" "onefive" "onesix" "twothree" "twofour"
"twofive" "twosix" "threefour" "threefive" "threesix" "fourfive"
"foursix" "fivesix")
좋습니다. 올바른 데이터가 있습니다. 이제 ( ) 대신 ( ) tprint
함수를 사용하십시오 .-t
prinl
-p
$ txr -t '[mapcar cat-str (comb (get-lines (open-files *args*)) 2)]' file1 file2 file3
onetwo
onethree
onefour
onefive
onesix
twothree
twofour
twofive
twosix
threefour
threefive
threesix
fourfive
foursix
fivesix
마지막으로 질문을 다시 읽고 다음과 결합하는 대신 필요에 따라 배열합니다 perm
.comb
$ txr -t '[mapcar cat-str (perm (get-lines (open-files *args*)) 2)]' file1 file2 file3
onetwo
onethree
onefour
onefive
onesix
twoone
twothree
twofour
twofive
twosix
threeone
threetwo
threefour
threefive
threesix
fourone
fourtwo
fourthree
fourfive
foursix
fiveone
fivetwo
fivethree
fivefour
fivesix
sixone
sixtwo
sixthree
sixfour
sixfive