合并不同目录中的特定文本文件

合并不同目录中的特定文本文件

我有 6 个目录。每个目录包含 8 个文本文件。这些文本文件共享相同的前缀。我需要按如下方式合并这些文本文件;

假设 directory_1 中的第一个文本文件包含包含文本的文件abc_1,directory_2 包含带有文本的文件abc_2,依此类推。第一个文本文件的合并文本文件需要采用以下格式:

abc_1
abc_2
abc_3
..
abc_6

第二、第三……第八个文本文件也需要按照同样的规则进行合并。

答案1

一种隐式方法(如果同一目录中的文件名以 _ 和数字结尾的不相关文件可能会失败),它根据文件编号命名每个合并文件:

DIRS_BASE=directory_
for ((FNUM=1; FNUM<9; FNUM++)); do
    cat ${DIRS_BASE}[1-6]/*_${FNUM} > merged_${FNUM}
done

一种显式的方法(更安全),使用前缀列表,根据文件编号命名每个合并文件:

DIRS_BASE=directory_
PLIST=(abc def ghi jkl mno pqr)
NDIRS=${#PLIST[@]}
for ((FNUM=1; FNUM<9; FNUM++)); do
    PLIST_NUM=(${PLIST[@]/%/_$FNUM})
    cat ${PLIST_NUM[@]/#/$DIRS_BASE[1-$NDIRS]/} > merged_${FNUM}
done

答案2

您的文件必须是可排序的,因此假设每个目录中的文件名称都以 1 到 8 之间的数字结尾,例如,foo1foo2一个目录中是 ,... ,在另一个目录中是bar1bar2... 等等,您可以使用cat循环for赋予它们:

for j in {1..8}; do cat directory_{1..6}/*$j > newfile$j; done

(不需要“引用”我们知道的变量是一位数)这将打印,例如,newfile1的内容

directory_1/foo1
directory_2/bar1
directory_3/baz1
...

无论这些内容是什么,以及在newfile2的内容中directory_1/foo2diectory_2/bar2等等

相关内容