텍스트 파일을 매개변수로 가져와 병합하는 스크립트를 작성하고 싶습니다.
- 모든 파일은 빈 줄로 구분된 그룹화된 줄로 구성됩니다.
- 스크립트는 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*$' "$@"