我有 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 之间的数字结尾,例如,foo1
在foo2
一个目录中是 ,... ,在另一个目录中是bar1
,bar2
... 等等,您可以使用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/foo2
,diectory_2/bar2
等等