最後の列を分離して中間列の周りに引用符を追加するには、awk / sedを使用しますか?

最後の列を分離して中間列の周りに引用符を追加するには、awk / sedを使用しますか?

というファイルがありますが、test.txt少し操作した後は次のようになります。

Metabolism
Global and overview maps
01100 Metabolic pathways (1689)
01110 Biosynthesis of secondary metabolites (677)
01120 Microbial metabolism in diverse environments (356)
01200 Carbon metabolism (44)
012111 Carbon metabolism (151) test: test test (44)

最後の列を角かっこ内の数字で区切って別の列にしたいと思います(選択した区切り文字としてセミコロンを使用)。また、括弧内の数字と最初のID番号の間のすべてのテキストの周りに引用符を入れたいと思います。最後に、ヘッダー行(この場合は最初の2行)を維持したいと思います。

私のコード:

 sed -r 's/ +/;/' test.txt | awk 'NF{NF-=1};1' | awk -F ";" '{sub($2, "\"&\""); print}'

私の現在の出力:

""
Global;"and overview"
01100;"Metabolic pathways"
01110;"Biosynthesis of secondary metabolites"
01120;"Microbial metabolism in diverse environments"
01200;"Carbon metabolism"
012111;Carbon (151) test: test test

ご覧のとおり、「Metabolism」ヘッダーは技術的に行の最後の値であり、2行目の「Map」なので消えます。 「Global」の後には必要ないセミコロンがあります。一部の行にはテキスト内の括弧内に数字があり、そのまま残す必要がありますが、そうでない場合は、すべての行は括弧内の値で終わり、この値はセミコロンで区切られた一意の列で区切る必要があります。また、最後の行の2番目の列全体に引用符を付けることはできませんが、他の行は問題ありません。最後に、3番目の列になるように括弧内の値をどのように区切るのかわかりません。

私が望む出力(数字をsep列に保つ):

"Metabolism"
"Global and overview"
01100:"Metabolic pathways";1689
01110:"Biosynthesis of secondary metabolites";677
01120:"Microbial metabolism in diverse environments";356
01200:"Carbon metabolism";44
012111:"Carbon metabolism (151) test: test test";44

awk GNUバージョン4.1.3とsed GNUバージョン4.2.2を使用してください。 Windows Linuxサブシステムで

ベストアンサー1

$ cat file
Metabolism
Global and overview maps
01100 Metabolic pathways (1689)
01110 Biosynthesis of secondary metabolites (677)
01120 Microbial metabolism in diverse environments (356)
01200 Carbon metabolism (44)
012111 Carbon metabolism (151) test: test test (44)
$ sed -e 's/^\([[:digit:]]*\)[[:blank:]]*/\1;"/' -e 's/[[:blank:]]*\((\([[:digit:]]*\))\)\{0,1\}[[:blank:]]*$/";\2/' file
;"Metabolism";
;"Global and overview maps";
01100;"Metabolic pathways";1689
01110;"Biosynthesis of secondary metabolites";677
01120;"Microbial metabolism in diverse environments";356
01200;"Carbon metabolism";44
012111;"Carbon metabolism (151) test: test test";44

ここで使用されているコマンドはsed2つの置換を実行します。

  • s/^\([[:digit:]]*\)[[:blank:]]*/\1;"/
    これは、行の先頭の空の数値シーケンスを置き換え、その後にゼロ個以上のスペース(タブまたはスペース)と数字とセミコロンが続きます。行の先頭に数字がない場合、行の先頭にセミコロンが挿入されます。また、セミコロンの後に2番目のフィールドの最初の二重引用符文字を挿入します。

  • s/[[:blank:]]*\((\([[:digit:]]*\))\)\{0,1\}[[:blank:]]*$/";\2/
    これは、ランダムな数、周囲の括弧、および行末の最初のスペース(対応する数の括弧がある場合)と一致します。また、行の末尾に余分なスペースを許可します。一致するテキストのみを一致する数字に置き換えます。挿入された数字の前には、;2番目のフィールドの2番目の二重引用符と区切り文字が続きます。

    あなたはしたいですか?削除する最後のフィールドの数字を入力し、sed2番目の式の代替テキストを変更します(代わりに"";\2

sedコマンド

sed -e 's/^\([[:digit:]]*\)[[:blank:]]*/\1;"/' \
    -e 's/[[:blank:]]*\((\([[:digit:]]*\))\)\{0,1\}[[:blank:]]*$/";\2/' file

拡張正規表現と短い角括弧式を使用して書き換えることができます(タブではなく空白のみを一致させたいと仮定する場合)。

sed -E \
    -e 's/^([0-9]*) */\1;"/' \
    -e 's/ *(\(([0-9]*)\))? *$/";\2/' file

おすすめ記事