아래와 같은 내용이 포함된 큰 텍스트 파일이 있습니다.
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
, 등 으로 몇 시간을 시도했지만 명령줄 텍스트 처리가 끔찍합니다. 미리 감사드립니다 tr
.grep
답변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
다른 언어를 요청하셨기 때문입니다. 여기하나name
Python에서 이를 수행하는 방법은 키 와 다음을 사용하여 값에 쉽게 액세스할 수 있도록 입력을 사전에 저장하는 것입니다 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="")
이 파일( 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