2

私は awk で非常に新しく、これを機能させようとして頭を叩いています。「image.list」内のファイルのリストを取得し、そこから「info」ファイルを作成しようとしています。ファイル名の途中から正規表現 (8 ~ 11 桁の数字) に一致する文字列を取得し、その一致のみを「情報ファイル」の指定された場所に出力する必要があります。その最後の部分は、私がやってのけるのに苦労している部分です。それを修正する助けが欲しいです。

これが私のテストファイルリストです:

SURGERY0001275678image1.jpg
SURGERY11134900211image2.jpg
SURGERY19257012image3.jpg
SURGERY273142590image4.jpg

これが私の現在のコードです:

awk 'BEGIN {print "-----TEST TAG FILE\tENCOUNTERS-----";}
> {print "FILE:  /tmp/imagetest/"$1,"\t","ENCOUNTER: ",($1~/^[0-9]{8,11}$/);}
> END{print "END REPORT";
> }' image.list > upload.tag

そして、ここに私の現在の出力があります:

-----TEST TAG FILE      ENCOUNTERS-----
FILE:  /tmp/imagetest/SURGERY0001275678image1.jpg        ENCOUNTER:  0
FILE:  /tmp/imagetest/SURGERY11134900211image2.jpg       ENCOUNTER:  0
FILE:  /tmp/imagetest/SURGERY19257012image3.jpg          ENCOUNTER:  0
FILE:  /tmp/imagetest/SURGERY273142590image4.jpg         ENCOUNTER:  0
END REPORT

表示する必要があるのは、「ENCOUNTER:」の後のファイル名の途中にある 8 ~ 11 桁の数字です。これまでに試したものはすべて、ファイル名全体または「0」のいずれかを出力します。

私はおそらくコースから外れているので、専門家の助けを借りたいと思います!

4

7 に答える 7

3

GNU シード

sed -r -e 's#(.*)#FILE:\t/tmp/imagetest/\1#;s/([0-9]*)(i[^i]*)$/\1\2\tENCOUNTER:\1/;1i -----TEST TAG FILE      ENCOUNTERS-----' -e '$aEND REPORT' file
-----タグファイルエンカウンターのテスト-----
ファイル: /tmp/imagetest/SURGERY0001275678image1.jpg ENCOUNTER:0001275678
ファイル: /tmp/imagetest/SURGERY11134900211image2.jpg 出会い:11134900211
ファイル: /tmp/imagetest/SURGERY19257012image3.jpg ENCOUNTER:19257012
ファイル: /tmp/imagetest/SURGERY273142590image4.jpg ENCOUNTER:273142590
終了報告
于 2013-06-14T21:16:57.433 に答える
2

以下は、正規表現に一致する文字列を抽出するための一般的に書かれた awk 関数 "extract()" です。

awk -v re='<whatever>' '
function extract(str,regexp)
{ RMATCH = (match(str,regexp) ? substr(str,RSTART,RLENGTH) : "")
  return RSTART
}
extract($0,re) { print RMATCH }
'

「re」を一致させたいものに設定するだけです。たとえば、次のようになります。

$ cat file
SURGERY0001275678image1.jpg
SURGERY11134900211image2.jpg
SURGERY19257012image3.jpg
SURGERY273142590image4.jpg

$ awk -v re='[[:digit:]]{8,11}' '
function extract(str,regexp)
{ RMATCH = (match(str,regexp) ? substr(str,RSTART,RLENGTH) : "")
  return RSTART
}
extract($0,re) { print RMATCH }
' file
0001275678
11134900211
19257012
273142590

または、同じ match()+substr() アプローチを使用してより具体的なソリューションを好む場合:

$ awk '
BEGIN{ print "-----TEST TAG FILE\tENCOUNTERS-----" }
{ printf "FILE:  %s\tENCOUNTER: %d\n", $0, (match($0,/[[:digit:]]{8,11}/) ? substr($0,RSTART,RLENGTH) : 0) }
END{ print "END REPORT" }
' file
-----TEST TAG FILE      ENCOUNTERS-----
FILE:  SURGERY0001275678image1.jpg      ENCOUNTER: 1275678
FILE:  SURGERY11134900211image2.jpg     ENCOUNTER: 11134900211
FILE:  SURGERY19257012image3.jpg        ENCOUNTER: 19257012
FILE:  SURGERY273142590image4.jpg       ENCOUNTER: 273142590
END REPORT

すべてのファイル名が同じパターンに従い、関心のある 8 ~ 11 桁のストリームの前に他の数字がない場合は、必要に応じ[[:digit:]]+て範囲を明示的に指定する代わりに、一致する RE として使用でき[[:digit:]]{8,11}ます。

于 2013-06-15T11:27:59.883 に答える