![在 shell 脚本中使用 find file 在输入和输出中使用通配符](https://linux22.com/image/128810/%E5%9C%A8%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8%20find%20file%20%E5%9C%A8%E8%BE%93%E5%85%A5%E5%92%8C%E8%BE%93%E5%87%BA%E4%B8%AD%E4%BD%BF%E7%94%A8%E9%80%9A%E9%85%8D%E7%AC%A6.png)
我有一个文件列表(见下文),我需要合并为单独的文件(merge1
,merge2
)。 merge1
将包含file1a_1
和file1a_2
; merge2
将包含file2a_1
, file2a_2
。
我试过
find . -name "file*_*" -exec cat {} \; >> mergefile*
即文件:
file1a_1
X1a_2
file1a_3
file1b_1
file1b_2
file1b_3
shell 脚本将所有文件放入合并文件中,并且不会将它们单独分离出来。
任何援助将不胜感激
答案1
如果文件都在当前目录中,您可以通过可能合并的最大数字(在下面的示例中为 100)硬编码一个循环:
shopt -s nullglob
for((index=1;index<100;index++))
do
inputs=( "file${index}"*_* )
if [ "${#inputs[@]}" -gt 0 ]
then
cat -- "${inputs[@]}" > "merge${index}"
fi
done
答案2
也许是这样的:
find . -name 'file[0-9]*_*' -type f -exec awk '
FNR == 1 {
output = FILENAME
sub(/.*\/file/, "", output)
sub(/[^0-9].*/, "", output)
output = "merge" output
}
{print > output}' {} +
请注意,以find
未指定的顺序查找文件,因此文件将以未指定的顺序合并。
请注意,如果给定文件的所有文件merge
均为空,merge
则不会创建该文件。如果您希望merge
在这些情况下获得一个空文件,并且您awk
是 GNU 文件,则可以将上面的内容更改为:
find . -name 'file[0-9]*_*' -type f -exec gawk '
BEGINFILE {
output = FILENAME
sub(/.*\/file/, "", output)
sub(/[^0-9].*/, "", output)
output = "merge" output
printf "" > output
}
{print > output}' {} +