從大量文字中分隔兩個值,每個讀數以空行分隔

從大量文字中分隔兩個值,每個讀數以空行分隔

我有一個大文字文件,內容如下所示,

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格式?

嘗試了幾個小時awksed等等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's 段落模式進行處理:

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),其中鍵是欄位名稱(位於符號左側),值是每行的=欄位值(位於符號右側)。=一旦段落被解析成這個結構,我們就會列印出「name」和「age」欄位的值。

答案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列印上一個指令輸出的第二個和第四個參數

您仍然面臨著理解谷歌可能深入解釋的任何語法的任何問題:)。

答案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="")

有鑑於此 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

相關內容