列の各行から特定のコンテンツを抽出します。

列の各行から特定のコンテンツを抽出します。

約13K行と2列のファイルがあります。の値を抽出したいが、'phNAME': 'value'各行に複数の行がある可能性がありますphNAME

phNAME1行に複数があり、それぞれを書きたい場合は、phNAME各値を別々の行に書きたいです(入力と出力の例を参照)。

以下は入力ファイルの例です。

ENSG00000268674 "[{'rgID': 'AMBN10042640', 'probeID': '246945', 'phenodata': [{'phcluster': '7', 'howgood': '1', 'bestgenes': '539', 'ScrID': 'M1_SyM_1', 'phenotypes': [{'ScrID': 'M1_SyM_1', 'phNAME': 'Dynamic changes', 'phID': 7, 'phWEIGHT': 1}]}], 'goodmatch': 0}, {'probeID': '249958', 'rgID': 'AMBN10047320', 'goodmatch': 0, 'phenodata': [{'phenotypes': [{'ScrID': 'E1_SyM_1', 'phWEIGHT': 1, 'phID': 2, 'phNAME': 'Strong inhibition of secretion'}], 'ScrID': 'E1_SyM_1', 'phcluster': '2', 'howgood': '1', 'bestgenes': '1378'}]}]"
ENSG00000215268 "[{'probeID': '105114', 'rgID': 'AMBN10004073', 'goodmatch': 0, 'phenodata': [{'howgood': '0.5', 'phcluster': '7', 'bestgenes': '539', 'phenotypes': [{'ScrID': 'M1_SyM_1', 'phNAME': 'Dynamic changes', 'phID': 7, 'phWEIGHT': 0.5}], 'ScrID': 'M1_SyM_1'}]}]"
ENSG00000130538 "[{'rgID': 'AMBN10042690', 'probeID': '247755', 'phenodata': [{'phenotypes': [{'phNAME': 'Intracellular retention of SH4(YES)-mCherry', 'phID': 2, 'phWEIGHT': 0.5, 'ScrID': 'B1_SyM_1'}], 'ScrID': 'B1_SyM_1', 'bestgenes': '984', 'howgood': '0.5', 'phcluster': '2'}], 'goodmatch': 0}]"

私が望む出力は次のとおりです。

ENSG00000268674 Dynamic changes
ENSG00000268674 Strong inhibition of secretion
ENSG00000215268 Dynamic changes
ENSG00000130538 Intracellular retention of SH4(YES)-mCherry

ベストアンサー1

解決策:

perl -lane 'print "$F[0] $_" for /'\''phNAME'\'': '\''([^'\'']+)/g' input.txt

出力:(公開された入力ファイルに基づいています)

ENSG00000268674 Dynamic changes
ENSG00000268674 Strong inhibition of secretion
ENSG00000215268 Dynamic changes
ENSG00000130538 Intracellular retention of SH4(YES)-mCherry

説明する:

リクエストに応じて詳細な指示が提供されます。
私の経験では、perlこれらの作業に最適なツールであることがよくあります。
コードは非常に混乱しているようです。なぜなら'\''これは単に脱出だからです'

おすすめ:

可能であれば、賢明に提案されているようにjsonデータを操作しないで構文解析を使用してください。jq

おすすめ記事