次の内容を含む「SAMPLE.txt」というファイルがあります。
P1
10,9:6/123456
P2
blah blah
P1
10,9:5/98765
P2
blah
blah
P1
blah blah
P2
出力ファイル「RESULT.txt」が欲しい。
Value1:123456
Value2:98765
Value3:NULL
まず、P1とP2部分の間のコンテンツをインポートしてから、10,9 * /値を見つけて別の値として保存する必要があります。特定のP1-P2ブロックにこの値がない場合は、「NULL」として保存したいと思います。
上記のコードをshell / awkにどのように書きますか?
私はスクリプトに初めて触れました。
ベストアンサー1
これは機能し、完全に移植可能です。
sed '\|^P1.*|!d;s||Value:|
:n
N;\|\nP2|!bn
s|:.*\n10,9[^/]*/|:|
s|\n.*||;s|:$|:NULL|'
プロセスは次のとおりです。
まず
^
扱います。P1
現在の行が
!
一致しない場合はd
削除されます。その場合は、次のよう
P1
に交換してください。Value:
:n
次に、extタグを設定してN
ext行を取得します。見つから
\nP2
ない場合は、extタグに戻り、見つかるまでもう一度やり直してください。!
b
:n
:.*\n10,9
次に、最初の発生/
まですべての文字の発生を削除します。\n
最初に使用可能なewlineと後続のすべての文字を削除します。:
最後の文字が後に続くコロンの場合、文字Value
列が挿入されますNULL
。
手順6と7が機能します。手順6では、\n
目的の数値文字列の前にあるewlineを削除しますが、そうでない場合は、次の\n
ewlineは次の文字列になりますValue:
。すべてステップ7に進みます。
これが実際に動作するものです:
sed '\|^P1.*|!d;s||Value:|
:n
N;\|\nP2|!bn
s|:.*\n10,9[^/]*/|:|
s|\n.*||;s|:$|:NULL|' <<\DATA
P1
10,9:6/123456
P2
blah blah
P1
10,9:5/98765
P2
blah
blah
P1
blah blah
P2
DATA
出力:
Value:123456
Value:98765
Value:NULL