구분 기호로 파일을 여러 부분으로 분할하는 방법

구분 기호로 파일을 여러 부분으로 분할하는 방법

다음과 같은 텍스트 파일이 있습니다.

aaaa 
bbbb
----  
cccc
----  
dddd

----구분 기호로 사용하고 dddd 또는 cccc 등을 꺼내는 방법은 무엇입니까 ? "나가기"란 명령을 실행하고 내 입력이 전체 파일의 세 번째 필드를 원한다는 것을 나타내는 경우 "dddd"를 얻는 것을 의미합니다. awkor 은 한 줄에서만 작동하는 것 같아서 cut이 명령을 사용하여 이를 수행할 수 있는 방법이 없습니다.

답변1

이를 수행하려면 sed 및 csplit을 사용할 수 있습니다.

sed -i.bak 's/----/-/g' file && csplit --suppress-matched file '/-/' '{*}'
  • sed파일에서 "----"를 단일 "-"로 대체합니다(만약을 대비해 백업을 생성합니다).

  • csplit그러면 파일은 단일 "-"를 기준으로 분할되고 여러 파일이 출력됩니다(예: xx00, xx01 등).

편집: 오타를 지적해준 @AdminBee에게 감사드립니다. 명령에서 추가 "파일"을 제거했습니다.

답변2

#! /usr/bin/env bash

# split-textfile-by-first-line.sh

# split a text file by delimiter lines.
# the delimiter lines are included
# as first lines of the output files.

# removing the delimiter line
# would require patching
# the arguments for tail and head.

# (c) Milan Hauth, MIT License

set -eu

input_file="$1"
first_line="$2"

input_size=$(stat -c%s "$input_file")

start=
while read match; do
    # get the byte offset of match
    end=${match%%:*}
    if [ "$end" = "-1" ]; then
        # last match. set end to end of file
        end=$input_size
        if [ -z "$start" ]; then
            echo "error: first_line was not found in input_file"
            exit 1
        fi
    fi
    if [ -n "$start" ]; then
        output_file="$input_file".$start-to-$end
        cat "$input_file" |
            tail -c +$start |
            head -c $((end - start)) \
            >"$output_file"
        echo done "$output_file"
    fi
    start=$end
done < <(
    grep -bxF "$first_line" "$input_file"
    echo -1
)

답변3

Raku(이전 Perl_6) 사용

한 줄씩 읽기:

~$ raku -ne 'BEGIN my @a; @a.push: $_ unless m/"----"/; END .say for @a[2];'  file
cccc

~$ raku -ne 'BEGIN my @a; @a.push: $_ unless m/"----"/; END .say for @a[3];'  file
dddd

한 번에 모든 파일 읽기:

~$ raku -e 'slurp.split(/ "\n" | "----" /, :skip-empty).[2].put;'  file
cccc

~$ raku -e 'slurp.split(/ "\n" | "----" /, :skip-empty).[3].put;'  file
dddd

Raku는 Perl 프로그래밍 언어 계열의 프로그래밍 언어입니다. 고급 유니코드 지원 기능이 내장되어 있습니다. 위에서는 0 인덱스 행, 원하는 세 번째 행(0 인덱스 == 2) 또는 원하는 네 번째 행(0 인덱스 == 3)을 가져올 수 있습니다.

입력 예:

aaaa
bbbb
----
cccc
----
dddd

부록: Raku를 사용한 루틴 lines(느긋하게 읽기):

~$ raku -e '.[2].put if .chars for lines.map: *.split("----", :skip-empty);'  file
cccc

~$ raku -e '.[3].put if .chars for lines.map: *.split("----", :skip-empty);'  file
dddd

https://raku.org

관련 정보