다음과 같은 텍스트 파일이 있습니다.
aaaa
bbbb
----
cccc
----
dddd
----
구분 기호로 사용하고 dddd 또는 cccc 등을 꺼내는 방법은 무엇입니까 ? "나가기"란 명령을 실행하고 내 입력이 전체 파일의 세 번째 필드를 원한다는 것을 나타내는 경우 "dddd"를 얻는 것을 의미합니다. awk
or 은 한 줄에서만 작동하는 것 같아서 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