長いテキストから2つの値を分離し、それぞれの読み取り値は空白行で区切られます

長いテキストから2つの値を分離し、それぞれの読み取り値は空白行で区切られます

以下のような大きなテキストファイルがあります。

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

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

では、それぞれnameをそれぞれ区切ってage、結果を1行に書き、値をスペースで区切るにはどうすればよいでしょうか。

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

が利用可能な場合、1 行以上の空白行で区切られたテキストのチャンクは、 の段落モード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) に解析します。ここで、キーは各行のフィールド名 (記号の左側=) で、値はフィールド値 (記号の右側=) です。段落がこの構造に解析されると、"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

このコマンドは2行を1行にします

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前のコマンド出力の2番目と4番目の引数を印刷する

それでも、Google が詳しく説明する構文を理解するのに問題が生じます :)。

答え4

別の言語をご希望でしたので、こちらです1つPython でこれを行うには、入力を辞書に保存して、キーとを使用して値に簡単にアクセスできるようにしnameます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

関連情報