두 문자열을 특정 순서로 grep하고 내 grep을 기반으로 한 줄씩 값을 계산하려면 어떻게 해야 합니까?

두 문자열을 특정 순서로 grep하고 내 grep을 기반으로 한 줄씩 값을 계산하려면 어떻게 해야 합니까?

Python 텍스트 사전이 있고 이를 사람이 읽을 수 있도록 편집한다고 가정해 보겠습니다. 이제 다음 입력과 같이 한 줄씩 표시됩니다.

입력하다

{"case":"0901","emailed":"yes","vote":1,"accepted":"no"},
{"case":"0908","emailed":"yes","vote":8,1"accepted":"yes"},
{"case":"0911","emailed":"no","vote":10,1"accepted":"yes"},
{"case":"0090","emailed":"yes","vote":3,1"accepted":"no"},

**모든 텍스트 파일은 이전 형식입니다**

yes그래서 나는 첫 번째와 no두 번째를 포함하는 줄을 찾고 싶습니다.

그래서 나는 출력이 다음과 같을 것으로 기대합니다

산출

{"case":"0901","emailed":"yes","vote":1,"accepted":"no"},
{"case":"0090","emailed":"yes","vote":3,1"accepted":"no"},

단어 순서대로 grep하는 방법을 찾지 못했습니다.

두 번째 질문은 내 결과에 관한 것입니까?

awk sum총 투표수를 계산하는 기능을 사용할 수 있나요 ? 이는 4,1출력에서 ​​나와야 합니다.

답변1

확인하다:

필요한 라인을 인쇄하세요

awk -F'[,:]' ' 
$4 ~ "yes" && $8 ~ "no" {
    print;
}' input.txt

산출

{"case":"0901","emailed":"yes","vote":1,"accepted":"no"},
{"case":"0090","emailed":"yes","vote":3,1"accepted":"no"},

합계를 계산

awk -F'[,:]' ' 
$4 ~ "yes" && $8 ~ "no" {
    sum += $6"."$7;
}
END {
    print sum;
}' input.txt

산출

4.1

답변2

파이썬 사전 텍스트가 있습니다

옳은파이썬사전 복구/처리:

내 메시지는 다음과 같습니다. Python은 Python입니다... 그리고 그 데이터 구조를 망쳐서는 안 됩니다.

recover_dict.py스크립트:

import sys, re, ast
with open(sys.argv[1], 'r') as f:
    items = ast.literal_eval(re.sub(r"(\d+),(\d+)", "\\1.\\2,", f.read().replace('\n','')))
    sum = 0
    for d in items:
        if d['emailed'] == 'yes' and d['accepted'] == 'no':
            sum += d['vote']
            print(d)
print(sum)

용법:

python recover_dict.py file

산출:

{'case': '0901', 'vote': 1, 'accepted': 'no', 'emailed': 'yes'}
{'case': '0090', 'vote': 3.1, 'accepted': 'no', 'emailed': 'yes'}
4.1

답변3

그것은 마치

grep 'yes.*no' yourfile \
    | sed -e 's/.*vote":\([0-9,]\+\).*/\1/g' -e 's/,/./g' \
    | paste -sd+ | bc

당신을 위해 일해야합니다.

설명하다

  • grep 'yes.*no' yourfile

단어 순서를 원 grep하지만 단어 사이에 무엇이 있는지 모르는 경우 .*공백이 아닌 문자를 0회 이상 반복하는 데 사용하세요. 출력(입력 파일 포함):

$ grep 'yes.*no' inputfile
{"case":"0901","emailed":"yes","vote":1,"accepted":"no"},
{"case":"0090","emailed":"yes","vote":3,1"accepted":"no"}
  • sed -e 's/.*vote":\([0-9,]\+\).*/\1/g' -e 's/,/./g'

위 출력 ,앞에 가 있으면 숫자(숫자 및 가능)를 일치시키고 로 바꿉니다. 산출...vote":grep,.

$ grep 'yes.*no' inputfile | sed -e 's/.*vote":\([0-9,]\+\).*/\1/g' -e 's/,/./g'
1.
3.1
  • paste -sd+

숫자 사이의 개행 문자를 +,로 바꾸고 출력합니다.

$ grep 'yes.*no' inputfile | sed -e 's/.*vote":\([0-9,]\+\).*/\1/g' -e 's/,/./g' | paste -sd+
1.+3.1
  • bc

위 작업( 1.+3.1)을 실행하면 다음이 출력됩니다.

$ grep 'yes.*no' inputfile | sed -e 's/.*vote":\([0-9,]\+\).*/\1/g' -e 's/,/./g' | paste -sd+ | bc
4.1

관련 정보