입력 및 출력에 와일드카드를 사용하여 쉘 스크립트에서 파일 찾기 사용

입력 및 출력에 와일드카드를 사용하여 쉘 스크립트에서 파일 찾기 사용

merge1별도의 파일( , ) 로 병합해야 하는 파일 목록(아래 참조)이 있습니다 merge2. , 을 merge1포함 합니다 .​file1a_1file1a_2merge2file2a_1file2a_2

나는 노력했다

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

즉, 파일:

file1a_1
X1a_2
file1a_3
file1b_1
file1b_2
file1b_3

쉘 스크립트는 모든 파일을 병합된 파일에 저장하고 개별적으로 분리하지 않습니다.

어떤 도움이라도 대단히 감사하겠습니다.

답변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이러한 경우 빈 파일을 원 하고 awkGNU 파일이 있는 경우 위의 내용을 다음과 같이 변경할 수 있습니다.

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

관련 정보