如何连接包含文件名的文件中包含的文件

问题描述 投票:0回答:1

我有 4 个 txt 文件,其中包含有序文件名集合

例如

文件 L001 包含 file1_L001 file2_L001 file3_L001 .. 等等(48 个文件),每个文件位于一个新通道中

文件L002包含file1_L002 file2_L002 file3_L002 ..依此类推(还有48个文件)

文件L003包含file1_L003 file2_L003 file3_L003 ..依此类推(还有48个文件)

文件 L004 包含 file1_L004 file2_L004 file3_L004 .. 以及最多 48 个文件名

我想要的是连接,使用 bash 创建新文件,类似

cat file1_L001 file1_L002 file1_L003 file1_L004 > All_file1.file
cat file2_L001 file2_L002 file2_L003 file2_L004 > All_file2.file
...
cat file48_L001 file48_L002 file48_L003 file48_L004 > All_file48.file

也就是说,对 file2_L001 file2_L002 file2_L003 file2_L004 等重复相同的过程,直到 file48

我的问题是我不知道如何调用特定文件以便包含到名称文件中。我可以使用 cat 命令获取这些名称,但我不知道如何选择要应用的这些文件中的一个,例如一系列嵌套的 for

bash
1个回答
0
投票

假设:

  • 必须根据
    L00?
    文件中的名称处理文件
  • 必须按照
    L00?
    文件中列出的相同顺序处理文件
  • 我们事先不知道
    L00?
    文件中的文件名

使用一对

for/while
循环的一个想法:

rm -rf All_file*.file

for ((i=1;i<=4;i++))
do
    while read -r fname
    do
        pfx="${fname%_*}"
        cat "${fname}" >> "All_${pfx}.file"
    done < L00${i}
done

如果我们知道所有第一行文件名都将被放在一起,那么所有第二行文件名等等......

使用

paste
命令来匹配关联文件,例如:

$ paste L001 L002 L003 L004 | head -3
file1_L001      file1_L002      file1_L003      file1_L004
file2_L001      file2_L002      file2_L003      file2_L004
file3_L001      file3_L002      file3_L003      file3_L004

然后我们可以将其输入到单个

while
循环中,例如:

rm -rf All_file*.file

while read -r flist
do
    read -r f1 _ <<< "${flist}"
    pfx="${f1%_*}"
    cat "${flist}" >> "All_${pfx}.file"
done < <(paste L001 L002 L003 L004)

第二种方法将会更加高效,因为我们将 172 (4x48)

cat / >>
操作减少到 48
cat / >>
操作。

© www.soinside.com 2019 - 2024. All rights reserved.