입력 파일($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"

관련 정보