在 shell 脚本中使用 find file 在输入和输出中使用通配符

在 shell 脚本中使用 find file 在输入和输出中使用通配符

我有一个文件列表(见下文),我需要合并为单独的文件(merge1merge2)。 merge1将包含file1a_1file1a_2merge2将包含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}' {} +

相关内容