大量のテキストから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。よろしくお願いしますsedtrgrep

答え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

perl1つ以上の空白行で区切られたテキストブロックは、可能であれば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

このコマンドは、1行を2行に置き換えます。

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

他の言語をリクエストされたからです。これは一つ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

関連情報