텍스트 파일을 병합하는 방법 - Bash 스크립트

텍스트 파일을 병합하는 방법 - Bash 스크립트

텍스트 파일을 매개변수로 가져와 병합하는 스크립트를 작성하고 싶습니다.

  • 모든 파일은 빈 줄로 구분된 그룹화된 줄로 구성됩니다.
  • 스크립트는 2개 이상의 매개변수를 허용할 수 있습니다.
  • 파일에는 더 많은 그룹이 포함될 수 있습니다.
  • 파일의 그룹 수가 다른 경우 한 파일의 그룹이 끝나면 다른 파일의 나머지 그룹은 다음 순서에 따라 순차적으로 추가되어야 합니다.111-211-121-122-221-222-223-131-132-133-231-241-251-261-271

    파일을 stdout으로 병합하고 싶습니다. 출력은 "첫 번째 파일의 첫 번째 세트, 두 번째 파일의 첫 번째 세트, 첫 번째 파일의 두 번째 세트..."여야 합니다.

    파일의 라인 형식은 다음과 같이 "파일 번호_그룹 번호_라인 번호"라고 가정합니다.

01_01_01

01_02_01
01_02_02
01_02_03

01_03_01
02_01_01
02_01_02

02_02_01

02_03_01
02_03_02

그러면 출력은 다음과 같아야 합니다.

01_01_01
02_01_01
01_02_01
01_02_02
01_02_03
02_02_01
01_03_01
02_03_01
02_03_02

사용해 보았지만 paste문제가 발생했습니다.

#!/bin/bash
paste -d "\n\n" $1 $2  | sed '/^[[:space:]]*$/d'

출력은 다음과 같습니다:

01_01_01
02_01_01
02_01_02
01_02_01
01_02_02
02_02_01
01_02_03
02_03_01
01_03_01
02_03_02

또한 각 줄이 어떤 파일에서 왔는지 확인하고 싶습니다. 다음과 같이 각 줄의 시작 부분에 파일 번호를 추가하려면 어떻게 해야 합니까?

1:01_01_01
2:02_01_01
1:01_02_01
1:01_02_02
1:01_02_03
2:02_02_01
1:01_03_01
2:02_03_01
2:02_03_02

답변1

순수 bash에서는 파일 설명자의 도움으로 이를 수행할 수 있습니다.

file1="$1"; file2="$2"
__print() {
  [[ $1 ]] && { printf '1: %s\n' "$1"; }
  [[ $2 ]] && { printf '2: %s\n' "$2"; }
}
if [[ $file1 ]] && [[ $file2 ]]; then
    while true; do
      read -r f1 <&3 || break
      read -r f2 <&4 || break
      __print "$f1" "$f2"
    done 3<"${file1}" 4<"${file2}"
else
    echo "Usage: '$0 <file1> <file2>'"
fi

다음과 같은 출력을 제공합니다.

1: 01_01_01
2: 02_01_01
2: 02_01_02
1: 01_02_01
1: 01_02_02
2: 02_02_01
1: 01_02_03
2: 02_03_01
1: 01_03_01
2: 02_03_02

답변2

셸과 구현 전반에 걸쳐 POSIX grep을 사용하여 이 작업을 수행할 수 있습니다.

grep -v '^\s*$' file1 file2 file...

입력을 기반으로 하는 두 파일의 출력은 다음과 같습니다.

file1:01_01_01
file1:01_02_01
file1:01_02_02
file1:01_02_03
file1:01_03_01
file2:02_01_01
file2:02_01_02
file2:02_02_01
file2:02_03_01
file2:02_03_02

그런 다음 추가 형식 지정을 위해 sed및 를 사용할 수 있습니다 .sort

스크립트에서:

#!/bin/sh
grep -v '^\s*$' "$@"

관련 정보