많은 양의 텍스트에서 두 값을 분리하고 각 판독값을 빈 줄로 구분합니다.

많은 양의 텍스트에서 두 값을 분리하고 각 판독값을 빈 줄로 구분합니다.

아래와 같이 내용이 포함된 큰 텍스트 파일이 있습니다.

name=ABC
class=3
age=7
roll_no=41 

name=XYZ
class=4
age=9
roll_no=23 

그럼 어떻게 하면 name각 값을 구분하여 age아래와 같이 공백으로 구분된 값으로 한 줄에 결과를 작성할 수 있을까요?

ABC 3
XYZ 9

JSON결과를 형식 으로 저장하는 도구/스크립트가 있습니까 ?

몇 시간 동안 노력했지만 명령 줄 텍스트 처리가 형편없었습니다 awk. 미리 감사드립니다 sed.trgrep

답변1

나는 awk를 사용할 것이다:

awk -F"=" '
    {data[$1] = $2} 
    function output() {
        if ("name" in data && "age" in data) 
            print data["name"], data["age"]
        delete data
    }
    NF == 0 {output()} 
    END     {output()}
' filename

답변2

perl하나 이상의 빈 줄로 구분된 텍스트 블록은 가능한 경우 perl단락 모드를 사용하여 처리하는 데 이상적입니다.

perl -n00e ' # Read the input file paragraph-by-paragraph
  # Split each paragraph into lines and join the lines with an = sign:
  $s = join "=",split /\n/;
  # Split the joined fields on = signs (with possible blanks around them):
  %h = split /\s*=\s*/,$s;
  print "$h{name} $h{age}\n" # Print the required information
' your_file

위 코드에서 코드는 파일을 해시 구조( %h)로 구문 분석합니다. 여기서 키는 필드 이름(기호 왼쪽)이고 값은 =각 행의 필드 값(오른쪽) 입니다. 기호). =단락이 이 구조로 구문 분석되면 "이름" 및 "나이" 필드의 값을 인쇄합니다.

답변3

다음 명령을 사용할 수 있습니다.

grep -E "name|age" filename | sed 'N;s/\n/ /' | sed 's/[=,]/ /g'| awk '{ print $2, $4}'

다음과 같은 출력이 제공됩니다.

ABC 7
XYZ 9

편집하다:

다음 명령은 name문자열 또는age

grep -E "name|age" filename

name=ABC
age=7
name=XYZ
age=9

이 명령은 한 줄을 두 줄로 바꿉니다.

grep -E "name|age" filename | sed 'N;s/\n/ /'
name=ABC age=7
name=XYZ age=9

다음 명령은 출력에서 ​​등호 =를 제거합니다.

grep -E "name|age" filename | sed 'N;s/\n/ /' | sed 's/[=,]/ /g'
name ABC age 7
name XYZ age 9

아래 명령은 요청을 인쇄합니다.

grep -E "name|age" filename | sed 'N;s/\n/ /' | sed 's/[=,]/ /g'| awk '{ print $2, $4}'
ABC 7
XYZ 9

awk이전 명령의 두 번째 및 네 번째 인수 출력을 인쇄합니다.

Google이 깊이 설명할 수 있는 구문을 이해하는 데 여전히 문제가 있습니다. :)

답변4

다른 언어를 요청하셨기 때문입니다. 이것은하나namePython에서 이를 수행하는 방법은 키와 값을 사용하여 값에 쉽게 액세스할 수 있도록 입력을 사전에 저장하는 것입니다 age.

#!/usr/bin/env python3

myDict = {}

with open("ages") as inFile:
    for line in inFile:
       if line == "\n":
            print(myDict['name'].rstrip() + " " + myDict['age'], end="")
            continue
       (key, value) = line.split("=")
       myDict[key] = value

print(myDict['name'].rstrip() + " " + myDict['age'], end="")

이 infile( ages)이 주어지면:

name=ABC
class=3
age=7
roll_no=41

name=XYZ
class=4
age=9
roll_no=23

나는 다음과 같은 결과를 얻습니다.

./pyAges.py 
ABC 7
XYZ 9

관련 정보