동일한 파일에 여러 번 나타나는 두 문자열 사이의 데이터 수를 얻는 방법

동일한 파일에 여러 번 나타나는 두 문자열 사이의 데이터 수를 얻는 방법

내 파일의 데이터는 다음과 같습니다.

START-OF-FIELDS
ID
NAME
DEPT
END-OF-FIELDS

START-OF-DATA
1|joy|cs
2|sam|ec
END-OF-DATA

START-OF-FIELDS
ID 
NAME
DOB
DEPT
ADDRESS
END-OF-FIELDS

START-OF-DATA
5|joe|13/2/2001/|ee|street1
3|gwen|4/08/1999|cs|street2
END-OF-DATA

예상 출력:-

ID
NAME
DEPT

데이터 세트 1의 개수는 3입니다.

ID 
NAME
DOB
DEPT
ADDRESS

데이터 세트 2의 개수는 5이고 동적 번호 매기기의 경우에도 마찬가지입니다. 데이터 세트.

시작 필드와 끝 필드 사이, 시작 데이터와 끝 데이터 사이의 데이터 수를 계산하고 싶습니다. 누구든지 나에게 이 작업을 수행하는 정확한 코드를 줄 수 있습니까? 나는 사용했다

sed -n '/^START-OF-FIELDS/,/END-OF-FIELDS/{s/^START-OF-FIELDS//;/^END-OF-FIELDS/d;p;}' Sourcefile.txt > START_OF_FIELDS.TXT

wc -l START_OF_FIELDS.TXT

하지만 원하는 결과를 얻지 못합니다.

답변1

새롭고 더 나은 문제 설명을 고려하면 실제로 더 쉽습니다.

#!/bin/bash
awk 'BEGIN {
            SETNR=0; 
            MODE="Non-Fields"}
(MODE=="Fields") && (! /START-OF-/ ) && (! /END-OF/ ) {
            print; 
            COUNT++
           }
/START-OF-FIELDS/ {
            COUNT=0; 
            SETNR++; 
            MODE="Fields"
           }
/END-OF/ {
            if (MODE=="Fields") {
                 printf ("Count for data set %d is: %d\n", SETNR, COUNT)
                };
            MODE="Non-Fields"
         }' $*

답변2

해결책 awk:

$ awk '/END-OF/{flag=0;printf "Count for data set %d is: %d\n",++i,count;count=0;printf "\n"}
    {if(flag){
         count++;
         print;
     }}
    /START-OF/{flag=1}' file
ID
NAME
DEPT
Count for data set 1 is: 3

1|joy|cs
2|sam|ec
Count for data set 2 is: 2

ID 
NAME
DOB
DEPT
ADDRESS
Count for data set 3 is: 5

5|joe|13/2/2001/|ee|street1
3|gwen|4/08/1999|cs|street2
Count for data set 4 is: 2

답변3

귀하의 문제는 더 잘 정의되어야 하지만 귀하의 예제 입력을 보면 귀하가 원하는 것이 무엇인지 추측하고 있습니다. 다음과 같은 작은 AWK 스크립트를 사용하십시오.

#!/bin/bash

awk '! /START-OF-/ {
  if (MODE=="DEFINE") { HEADER=HEADER $0 "|" }
  else if ((MODE=="DATA") && (NF>0)) { print }
}
 /START-OF-FIELDS/ { MODE="DEFINE"; HEADER="" }
 /START-OF-DATA/ {
      print HEADER
      MODE="DATA"
      HEADER=""
     }' | sed 's/|$//'

그러면 다음이 생성됩니다.

ID|NAME|DEPT
1|joy|cs
2|sam|ec
ID |NAME|DOB|DEPT|ADDRESS
5|joe|13/2/2001/|ee|street1
3|gwen|4/08/1999|cs|street2

참고: 저는 게을러서 헤더의 각 필드 뒤에 수직 막대를 추가했습니다. 그런 다음 SED 명령을 사용하여 후행 V바를 제거했습니다.

답변4

sed -n '/^START-OF-DATA$/,/^$/{/^START-OF-DATA$/d;/^$/d;p;}' filename

그건:

  • START-OF-DATA- 와 다음 빈 줄 사이의 줄을 수집합니다 /^START-OF-DATA$/,/^$/. 다음 줄을 사용하면:
    • 구분선을 제거 /^START-OF-DATA$/d하고/^$/d
    • 나머지는 인쇄하세요 -p

관련 정보