我想以成对的方式连接目录中现有的.txt文件 - 创建原始文件的所有可能组合。我不知道如何使用bash
或zsh
shell scripting
,不是我的强项。我想需要将新文件输出到另一个目录,以防止组合呈指数级增长。
下面是一个虚拟示例。实际上,我有更多的文件。
echo 'A' > A.txt
echo 'B' > B.txt
echo 'C' > C.txt
其中A + B
与B + A
相同,顺序不重要。
期望输出:
>ls
AB.txt AC.txt BC.txt
>head AB.txt
# A
# B
>head AC.txt
# A
# C
>head BC.txt
# B
# C
下面是一个尝试(在某些东西...
#!/bin/zsh
counter = 1
for i in *.txt; do
cat $i $counter $i
done
任何指示将不胜感激。
在zsh
中,您可以执行以下操作:
filelist=(*.txt)
for file1 in $filelist; do
filelist=(${filelist:#$file1})
for file2 in $filelist; do
cat "$file1" "$file2" > "${file1%.txt}$file2"
done
done
解释:
将*.txt
列表存储在filelist
中,周围的括号使其成为一个数组:
filelist=(*.txt)
循环访问filelist
中的所有元素以进行file1
:
for file1 in $filelist; do
从filelist
中删除file1
:
filelist=(${filelist:#$file1})
循环访问filelist
中的其余元素以进行file2
for file2 in $filelist; do
连接file1
和file2
。保存到具有组合名称的新文件中(从第一个文件名的末尾删除.txt
。
cat "$file1" "$file2" > "${file1%.txt}$file2"
done
done
您可以使用简单的嵌套循环来解决它
for a in *; do
for b in *; do
cat "$a" "$b" > "${a%.txt}$b"
done
done
您也可以尝试递归方法
#!/bin/bash -x
if [ $# -lt 5 ]; then
for i in *.txt; do
$0 $* $i;
done;
else
name=""
for i ; do
name=$name${i%.txt}
done
cat $* >> $name.txt
fi;
这在 Python 中很容易。将其放在具有可执行权限的/usr/local/bin/pairwise
:
#!/usr/bin/env python
from itertools import combinations as combo
import errno
import sys
data = sys.stdin.readlines()
for pair in combo(data, 2):
try:
print pair[0].rstrip('n'), pair[1].rstrip('n')
except OSError as exc:
if exc.errno = errno.EPIPE:
pass
raise
然后试试这个:
seq 4 | pairwise
结果是:
1 2
1 3
1 4
2 3
2 4
3 4
或者试试这个:
for x in a b c d e; do echo $x; done | pairwise
结果是:
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e