텍스트 파일의 미리 정의된 각 단어에 증분 개수를 추가하는 방법은 무엇입니까?

텍스트 파일의 미리 정의된 각 단어에 증분 개수를 추가하는 방법은 무엇입니까?

텍스트 파일의 미리 정의된 각 단어에 증분 개수를 추가하는 방법은 무엇입니까?

이 질문과 같습니다. 텍스트 파일의 각 줄에 증분 개수를 추가하는 방법은 무엇입니까?

텍스트 파일에 델타 카운트를 추가하고 싶습니다. 하지만 각 줄에 증분 개수를 추가하는 대신 미리 정의된 단어에 증분 개수를 추가하고 싶습니다.

예를 들어, 텍스트에서 "cinema"라는 단어를 계산하려면 "cinema"의 모든 항목을 "cinemaN"으로 변경하고 싶습니다. 여기서 N은 증분 수이고 N의 최대값은 발생 횟수에 따라 달라집니다. "영화"가 텍스트에 나타나는 경우 "영화"라는 단어가 사용된 횟수입니다.

따라서 입력 텍스트 파일에는 다음 텍스트가 포함됩니다.

그는 영화관으로 운전했습니다. 그런 다음 그는 영화관에 들어가 표를 샀는데, 나중에 알고 보니 마지막으로 영화관에 간 지 2년이 넘었습니다.

다음 내용을 포함하는 출력 파일을 생성합니다.

그는 영화관으로 운전했습니다1. 나중에 그는 표를 사기 위해 영화관에 들어갔고, 나중에 영화관에 마지막으로 간 지 2년이 넘었다는 것을 알게 되었습니다.

바람직하게는 선택한 단어에 역순으로 번호를 매길 수 있기를 바랍니다.

즉, 다음 내용이 포함된 두 번째 출력 파일이 생성됩니다.

그는 영화관으로 차를 몰고 갔다3. 나중에 그는 표를 사기 위해 영화관에 들어갔고, 나중에 영화관에 마지막으로 간 지 2년이 넘었다는 것을 알게 되었습니다.

답변1

나는 perl이것을 선호한다:

$ cat ip.txt 
He drove his car to the cinema. He then went inside the cinema to purchase tickets, and afterwards discovered that it was more then two years since he last visited the cinema.

$ # forward counting is easy
$ perl -pe 's/\bcinema\b/$&.++$i/ge' ip.txt 
He drove his car to the cinema1. He then went inside the cinema2 to purchase tickets, and afterwards discovered that it was more then two years since he last visited the cinema3.
  • \bcinema\b검색할 단어는 다른 단어의 일부와 일치하지 않도록 단어 경계를 사용합니다. 예를 들어, \bpar\b일치하지 않습니다 apart또는 park또는spar
  • geg플래그는 전역 교체에 사용됩니다. ePerl 코드를 대체 섹션에 사용하도록 허용
  • $&.++$i일치 단어와 사전 증가된 값을 연결한 것입니다. $i기본값 은 다음과 같습니다.0


반대로, 먼저 카운트를 얻어야 합니다...

$ c=$(grep -ow 'cinema' ip.txt | wc -l) perl -pe 's/\bcinema\b/$&.$ENV{c}--/ge' ip.txt 
He drove his car to the cinema3. He then went inside the cinema2 to purchase tickets, and afterwards discovered that it was more then two years since he last visited the cinema1.
  • c해시를 통해 액세스할 수 있는 환경 변수가 됩니다.%ENV

또는 perl전체 파일을 단독으로 사용하십시오.

perl -0777 -pe '$c=()=/\bcinema\b/g; s//$&.$c--/ge' ip.txt 

답변2

GNU awk를 사용한 다중 문자 RS, 대소문자 구분 없는 일치 및 단어 경계:

$ awk -v RS='^$' -v ORS= -v word='cinema' '
    BEGIN { IGNORECASE=1 }
    { cnt=gsub("\\<"word"\\>","&"); while (sub("\\<"word"\\>","&"cnt--)); print }
' file
He drove his car to the cinema3. He then went inside the cinema2 to purchase tickets, and afterwards discovered that it was more then two years since he last visited the cinema1.

답변3

단어 뒤의 구두점을 고려하세요.
전달 번호:

word="cinema"
awk -v word="$word" '
    { 
      for (i = 1; i <= NF; i++) 
        if ($i ~ word "([,.;:)]|$)") { 
          gsub(word, word "" ++count,$i) 
        }
      print 
    }' input-file

뒤로 번호 매기기:

word="cinema"
count="$(awk -v word="$word" '
    { count += gsub(word, "") }
    END { print count }' input-file)"
awk -v word="$word" -v count="$count" '
    { 
      for (i = 1; i <= NF; i++) 
        if ($i ~ word "([,.;:)]|$)") { 
          gsub(word, word "" count--, $i) 
        }
      print 
    }' input-file

답변4

내림차순으로 단어에 태그를 지정하려면 정규식을 뒤집고 데이터를 뒤집은 다음 마지막으로 날짜를 다시 뒤집어 변환을 수행합니다.

perl -l -0777pe '$_ = reverse reverse =~ s/(?=\bamenic\b)/++$a/gre' input.data

결과

He drove his car to the cinema3. He then went inside the cinema2 to purchase tickets, and
afterwards discovered that it was more then two years since he last visited the cinema1.

단어에 오름차순으로 레이블을 지정하려면 단어에 대해 역방향 검색을 수행합니다.

perl -lpe 's/\bcinema\b\K/++$a/eg' input.data

결과

He drove his car to the cinema1. He then went inside the cinema2 to purchase tickets, and
afterwards discovered that it was more then two years since he last visited the cinema3.

관련 정보