按特定顺序合并两个不同名称列表的文件

按特定顺序合并两个不同名称列表的文件

在一个文件夹中,我有两组 6 个文件:

第一组:

1st-letter-00 - 1st-letter-05

第二组:

verse-00 - verse-05

如何连接这两组文件,使结果成为一个文件,其中从上到下包含所有文件,如下所示:

Content of 1st-letter-00
Content of verse-00
Content of 1st-letter-01
Content of verse-01
etc.

我希望问题很清楚。

答案1

这个答案中有两个解决方案:

  1. 循环一组中的文件并构造另一组中的文件的名称,以及
  2. 循环数字并在循环中构造两个文件名。

将一组文件与另一组文件配对的一种方法是循环其中一组文件并根据这些文件构造另一组文件名。如果您可能不确切知道文件名后缀是什么,或者一组中有多少个文件,但仍希望将一组中的任何文件与另一组中的文件进行匹配,那么这将很有用。

for verse in verse-*; do
    letter1=1st-letter-${verse#verse-}

    cat "$letter1" "$verse"
done >result.txt

... 要不就

for verse in verse-*; do cat "1st-letter-${verse#verse-}" "$verse"; done >result.txt

这将循环当前目录中以字符串 开头的所有名称verse-。这将包括您的所有文件verse-00verse-01。如果您想确保只匹配前六个(或者如果您有其他具有相同文件名前缀的文件),请使用该模式verse-0[0-5]而不是verse-*.

在每次迭代中,通过从的当前值中删除前缀并在其前面加上字符串 来1st-letter构造相应文件的名称。然后将这两个文件连接起来。verse-$verse1st-letter-

整个循环的输出被写入result.txt

测试:

$ ls -l
total 48
-rw-r--r--  1 kk  wheel  26 Nov 19 11:48 1st-letter-00
-rw-r--r--  1 kk  wheel  26 Nov 19 11:48 1st-letter-01
-rw-r--r--  1 kk  wheel  26 Nov 19 11:48 1st-letter-02
-rw-r--r--  1 kk  wheel  26 Nov 19 11:48 1st-letter-03
-rw-r--r--  1 kk  wheel  26 Nov 19 11:48 1st-letter-04
-rw-r--r--  1 kk  wheel  26 Nov 19 11:48 1st-letter-05
-rw-r--r--  1 kk  wheel  21 Nov 19 11:48 verse-00
-rw-r--r--  1 kk  wheel  21 Nov 19 11:48 verse-01
-rw-r--r--  1 kk  wheel  21 Nov 19 11:48 verse-02
-rw-r--r--  1 kk  wheel  21 Nov 19 11:48 verse-03
-rw-r--r--  1 kk  wheel  21 Nov 19 11:48 verse-04
-rw-r--r--  1 kk  wheel  21 Nov 19 11:48 verse-05

上面的循环在这里运行。

$ cat result.txt
Contents of 1st-letter-00
Contents of verse-00
Contents of 1st-letter-01
Contents of verse-01
Contents of 1st-letter-02
Contents of verse-02
Contents of 1st-letter-03
Contents of verse-03
Contents of 1st-letter-04
Contents of verse-04
Contents of 1st-letter-05
Contents of verse-05

使用不太旧的版本bash(macOS 上的默认版本bash太旧),或者使用zshyash,您还可以循环您想要使用的特定零填充数字,在循环中构造两个文件名:

for num in {00..05}; do
    cat "1st-letter-$num" "verse-$num"
done >result.txt

使用旧版本bash(它不会在大括号扩展中执行零填充整数),您可以使用

for num in 0{0..5}; do
    cat "1st-letter-$num" "verse-$num"
done >result.txt

...并包含超过 的数字9,您可以使用

for num in 0{0..9} {10..99}; do
    cat "1st-letter-$num" "verse-$num"
done >result.txt

00这将涵盖到 的数字99

答案2

这很大程度上取决于您的解决方案需要多大的灵活性。如果您知道这些文件将始终被调用1st-letter-NNverse-NN,那么您可以在 shell 脚本中执行如下操作

#!/bin/bash

OUTFILE=$1  # take output file from command-line
:>$OUTFILE  # and initialize it as "empty" in case it already existed

for i in {00..05}
do
    cat 1st-letter-$i >> $OUTFILE
    cat verse-$i >> $OUTFILE
done

然后您可以调用此脚本,如下所示

user@host$ ./my_script.sh merged_content.txt

合并后的内容将出现在文件中merged_content.txt

从这里开始,您可以根据需要扩展它以使其更加灵活。

相关内容