以成对方式连接文件



我想以成对的方式连接目录中现有的.txt文件 - 创建原始文件的所有可能组合。我不知道如何使用bashzsh shell scripting,不是我的强项。我想需要将新文件输出到另一个目录,以防止组合呈指数级增长。

下面是一个虚拟示例。实际上,我有更多的文件。

echo 'A' > A.txt
echo 'B' > B.txt
echo 'C' > C.txt

其中A + BB + 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

连接file1file2。保存到具有组合名称的新文件中(从第一个文件名的末尾删除.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

相关内容

  • 没有找到相关文章

最新更新