입력 파일($1)

입력 파일($1)

declarative.txt이 문장이 선언문인지 아니면 이제 파일에 저장한 다음 나머지 문장을 파일에 넣은 다음 파일 끝에 others.txt줄 번호를 입력하는지 확인하고 싶습니다 .declarative.txt

문장이 마침표로 끝나면 "선언적" 문장입니다.

입력 파일($1)

this life is good.
neverthe less.
suppppppppppppppppperb.
the best coders.
everything is good?
are you okay dude?
ma man !!

지금까지 내 코드

#!/bin/sh
while read row
do
x=$row | grep "\.$"
y=$row | grep -v "\.$"
echo $x >> declarative.txt
echo $y >> others .txt
done < $1
cnt=`wc -l declarative.txt`
echo $cnt >> declarative.txt

답변1

grep입력 파일의 줄을 점으로 끝나는 줄과 점으로 끝나지 않는 줄로 분리하려면 한 줄에 하나의 문장만 있다고 가정하고 이를 두 개의 다른 출력 파일에 저장하려면 다음과 같이 두 번 사용할 수 있습니다 .

grep    '\.$' "$1" >declarative.txt
grep -v '\.$' "$1" >others.txt

쉘 루프에서는 라인 전체를 반복할 필요가 없습니다(실제로는낙담한). 텍스트 파일을 처리하는 Unix 도구에는 이미 루프가 내장되어 있으므로 grep예를 들어 입력 데이터의 각 줄에 정규식이 차례로 적용되고 일치하는 데이터가 출력됩니다.

입력 파일을 한 번만 구문 분석할 수도 있습니다 awk. 예를 들면 다음과 같습니다.

awk '/\.$/ { print >"declarative.txt"; next }
           { print >"others.txt" }' "$1"

declarative.txt현재 줄이 점으로 끝나면 현재 줄을 파일에 인쇄하는 블록이 트리거됩니다. 다른 모든 라인에 대해 또 다른 블록이 트리거됩니다.

...또는 다음과 같이 사용 sed:

sed -n -e '/\.$/w declarative.txt' \
       -e '//!w others.txt' "$1"

현재 declarative.txt줄이 점으로 끝나면 쓰여지고, others.txt그렇지 않으면 쓰여집니다. 빈 //표현식은 "마지막 정규 표현식 재사용"을 의미하고, !빈 표현식은 "실행"을 의미합니다.이것표현이 일치하지 않는 경우".

답변2

이것은아니요선언문을 식별하는 효과적인 방법입니다. 우선, 귀하의 문장 중 대문자로 시작하는 문장이 없으며, 많은 문장이 전혀 문장이 아닙니다. 그러나 입력 파일의 행을 두 개의 파일로 분할하려는 경우(하나는 마침표로 끝나는 행을 포함하고 다른 하나는 나머지 행을 포함함) 다음을 사용할 수 있습니다 awk.

awk '{/\.$/ ? f="fullStop" : f="others"; print > f}' file

이것을 쉘 스크립트로 실행해야 하는 경우 간단히 다음을 사용할 수 있습니다.

#!/bin/sh
awk '{/\.$/ ? f="fullStop" : f="others"; print > f}' "$1"

쉘 루프여야 하는 경우(이건 좋은 생각이 아니야), 넌 할 수있어:

#!/bin/bash
while IFS= read -r line; do 
    [[ $line =~ \.$ ]] && 
        echo "$line" >> fullStop || 
        echo "$line" >> others
    done < "$1"

또는 bash 특정 기능을 사용할 수 없는 경우:

#!/bin/sh
while IFS= read -r line; do 
    printf '%s\n' "$line" | grep -q '\.$' && 
    echo "$line" >> fullStop || 
    echo "$line" >> others
done < "$1"

관련 정보