3

私は自分の質問への答えをグーグルで検索しようとしましたが、答えがそこにあると確信しています。何を検索すればよいかわかりません。基本的に私がやろうとしているのは、ファイルから行を取り出して最後の 2 つのフィールド(" " で区切られている\) を取得し、それらの 2 つのフィールドを出力することです。

ただし、これらのフィールドを2 つのバックスラッシュで区切って出力したいと考えています。(私はWindowsパスで作業しています)これが私の声明です

$ line = C:\Windows\System32\folder1\folder2\folder3\executable.exe

$ echo $line | awk -F "\\" '{print $(NF-2)$(NF-0)}'

出力を返したいfolder3\\executable.exe

私のawkの経験は限られています。助けてくれてありがとう

4

3 に答える 3

2

コマンドラインから:

$ echo $line | awk 'BEGIN{FS="\\"; OFS="\\\\"} {print $(NF-1), $NF}'

あなたに与える

folder3\\executable.exe

あなたのためのline

FS処理される行のOFSフィールドセパレータ、出力フィールドセパレータを設定します。ダブル\\はシングルの特別な意味を逃れるために必要\です。

の割り当てでは、の前後にスペースを入れずlineに文字列を囲む必要があることに注意してください。つまり、""=

line="C:\Windows\System32\folder1\folder2\folder3\executable.exe"

または、このスクリプト(so.awk)

BEGIN { FS="\\"
        OFS="\\\\"}
{print $(NF-1), $NF}

呼び出された場合、1つ(または複数)のパスecho $line | awk -f so.awk data.txtが含まれている場所と同じ出力が得られますdata.txt

更新

先頭の二重円記号を印刷する必要がある場合:print "", $(NF-1), $NF@Dennis Williamsonによる有益なコメントで述べられているように、先頭に空の文字列を追加することでトリックを実行します

于 2012-07-03T13:54:58.573 に答える
0

文字列を逆に使用revし、文字列を '\' セパレーターで分割してから、配列の最初の 2 つの文字列を取得することもできます。最後に、前のセパレータ「\」を使用して文字列を作成し、もう一度逆にします。

ルートと最後のサブディレクトリの間のサブディレクトリの数を常に知ることができるとは限らないため、逆が必要です。

于 2012-07-03T14:03:57.227 に答える
0

設定する変数は、出力フィールド区切り記号の OFS です。

于 2012-07-03T13:51:45.760 に答える