특정 문자열을 기반으로 단일 파일을 다른 파일로 분할

특정 문자열을 기반으로 단일 파일을 다른 파일로 분할

다음 항목이 포함된 파일이 있습니다.

vdomain
v2host
v3server
v1adapter
vhost
v2domain
v1application

이 모든 항목을 다음과 같은 4개의 다른 파일로 분할하고 싶습니다.

file1 : "v"로 시작하는 이름을 포함해야 합니다.

vdomain
vhost

file2 : "v1"로 시작하는 이름을 포함해야 합니다.

v1application
v1adapter

file3 : "v2"로 시작하는 이름을 포함해야 합니다.

v2host
v2domain

file4 : "V3"으로 시작하는 이름을 포함해야 합니다.

v3server

답변1

사용 awk:

awk '/^v[^123]/ { print >"file1" }
     /^v1/ { print >"file2" }
     /^v2/ { print >"file3" }
     /^v3/ { print >"file4" }' inputfile

이렇게 하면 4개의 파일이 생성됩니다.

첫 번째 정규 표현식은 va로 시작하고 숫자 1, 2, 3이 뒤에 오지 않는 줄만 일치합니다(이 줄은 다른 파일로 이동하기 때문입니다). 정규식과 일치하지 않는 줄은 삭제됩니다.

다음과 동일 sed:

sed -n \
    -e '/^v[^123]/w file1' \
    -e '/^v1/w file2' \
    -e '/^v2/w file3' \
    -e '/^v3/w file4' inputfile

이 명령은 w현재 sed행을 지정된 파일에 씁니다.

그리고 쉘 루프를 사용하세요(당신은진짜이것을 사용하고 싶습니다):

rm -f file[1234]
while read -r words; do
    case "$words" in
        v1*) printf '%s\n' "$words" >>file2 ;;
        v2*) printf '%s\n' "$words" >>file3 ;;
        v3*) printf '%s\n' "$words" >>file4 ;;
        v*)  printf '%s\n' "$words" >>file1 ;;
    esac
done <inputfile

이것은거의각 입력 줄 뒤의 공백이 제거되고 초기 공백도 무시되어 제거된다는 점만 제외하면 동일합니다. 여기서도 테스트 순서가 중요합니다.

마지막으로, with 를 사용하면 ed스크립트는 의심할 여지 없이 with 에서 사용하는 것과 동일합니다 sed.

cat <<ED_END | ed -s inputfile
/^v[^123]/w file1
/^v1/w file2
/^v2/w file3
/^v3/w file4
ED_END

관련 정보