如何使用bash扩展的globbing和否定模式自动连接多个系列的文件



非常感谢您对此事的任何建议和反馈。这就是我的处境:

我有一个目录,里面有几百个文件,所有文件都以foo*开头,以*.txt结尾;组##"文件看起来是这样的:

foo.Group1.1.txt
foo.Group1.2.txt
foo.Group1.4.txt
foo.Group2.45.txt
.
.
.
foo.Group16.9.txt 

这些文件从Group1开始,到Group16结束。它们是简单的单列txt文件,每个文件有几千行。每一行都是一个数字。

我想用这些文件进行一系列的连接,其中我用";Group1";然后除";Group1";以及";Group2";然后除";Group1"Group2";,以及";Group3";等等,直到我只剩下最后一组:";组16";

为了做到这一点,我使用了一个带有否定语法的bash扩展globbing表达式来连接所有文件;Group1";作为他们的ID。

我制作了一个目录";千斤顶";并将连接的文件输出到该子目录中的txt文件中:

cat !(*Group1.*) > jacks/jackknife1.freqs.txt

然后我可以继续使用这个命令;Group2";以及";Group3";用于随后的级联。

cat !(*Group1.*|*Group2.*) > jacks/jackknife2.freqs.txt
cat !(*Group1.*|*Group2.*|*Group3.*) > jacks/jackknife3.freqs.txt

从技术上讲,这是可行的。16组手动操作并不可怕。但我想知道是否有一种方法,也许可以使用循环或bash脚本来自动化这个过程并加快它的速度?

我将感谢任何关于这个问题的建议或线索!

非常感谢,达尼埃拉

关于bash globbing的一些尝试

cat之前尝试使用echo

touch foo.Group{1..3}.{1..5}.txt
ls -l 
total 0
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group1.1.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group1.2.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group1.3.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group1.4.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group1.5.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group2.1.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group2.2.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group2.3.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group2.4.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group2.5.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group3.1.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group3.2.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group3.3.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group3.4.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group3.5.txt

然后

echo !(*Group1.*)
foo.Group2.1.txt foo.Group2.2.txt foo.Group2.3.txt foo.Group2.4.txt foo.Group2.5.txt foo.Group3.1.txt foo.Group3.2.txt foo.Group3.3.txt foo.Group3.4.txt foo.Group3.5.txt

好的,还有

echo !(*Group[23].*)
foo.Group1.1.txt foo.Group1.2.txt foo.Group1.3.txt foo.Group1.4.txt foo.Group1.5.txt

echo !(*Group*(1|3).*)
foo.Group2.1.txt foo.Group2.2.txt foo.Group2.3.txt foo.Group2.4.txt foo.Group2.5.txt

甚至

echo !(*Group*(1|*.3).*)
foo.Group2.1.txt foo.Group2.2.txt foo.Group2.4.txt foo.Group2.5.txt foo.Group3.1.txt foo.Group3.2.txt foo.Group3.4.txt foo.Group3.5.txt

echo !(*Group*(1|*.[2-4]).*)
foo.Group2.1.txt foo.Group2.5.txt foo.Group3.1.txt foo.Group3.5.txt

我会让你们想想最后两个样品!;-(

最新更新