以下のようにコンテンツを含む大きなテキストファイルがあります。
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
perl
1つ以上の空白行で区切られたテキストブロックは、可能であれば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
他の言語をリクエストされたからです。これは一つ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