Utilizando o arquivo find no shell script usando curingas em entrada e saída

1

Eu tenho uma lista de arquivos (veja abaixo) Eu preciso mesclar em arquivos separados ( merge1 , merge2 ). merge1 conteria file1a_1 e file1a_2 ; merge2 conteria file2a_1 , file2a_2 .

Eu tentei

find . -name "file*_*"  -exec cat {} \; >> mergefile*

i.e. Arquivos:

file1a_1
X1a_2
file1a_3
file1b_1
file1b_2
file1b_3

O script de shell coloca todos os arquivos em um arquivo de mesclagem e não os separa individualmente.

Qualquer ajuda seria apreciada

    
por dejaomare 02.03.2018 / 22:41

2 respostas

1

Se os arquivos estiverem todos no diretório atual, você poderá codificar um loop através do maior número que você pode mesclar (100 no exemplo abaixo):

shopt -s nullglob
for((index=1;index<100;index++))
do
  inputs=( "file${index}"*_* )
  if [ "${#inputs[@]}" -gt 0 ]
  then
    cat -- "${inputs[@]}" > "merge${index}"
  fi
done
    
por 30.03.2018 / 02:59
1

Talvez algo como:

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}' {} +

Observe que find encontra arquivos em uma ordem não especificada, portanto, os arquivos serão mesclados em uma ordem não especificada.

Observe que, se todos os arquivos para um determinado arquivo merge estiverem vazios, o arquivo merge não será criado. Se você preferir obter um arquivo merge vazio nesses casos, e se seu awk for o GNU, você pode alterar o acima para:

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}' {} +
    
por 02.03.2018 / 22:51