以下のような大きなテキストファイルがあります。
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