2

これは私の入力ファイルです。

------------------------------------------------------------------------
r4544 | n479826 | 2012-08-28 07:12:33 -0400 (Tue, 28 Aug 2012) | 1 line
Changed paths:
   M /branches/8.6.0/conf/src/main/config/RTSConfig.xml

CET-402: some text comment
------------------------------------------------------------------------
r4550 | n479826 | 2012-09-04 05:51:29 -0400 (Tue, 04 Sep 2012) | 1 line
Changed paths:
   M /branches/8.6.0/conf/src/main/config/RTSConfig.xml
   M /branches/8.6.0/conf/src/main/config/base.cfg
   M /branches/8.6.0/conf/src/main/config/prod.cfg
   M /branches/8.6.0/conf/src/main/config/qa.cfg
   M /branches/8.6.0/conf/src/main/config/uat.cfg

CET-438: some text comment

私の出力は次のようになります。

r4544 | n479826 | 2012-08-28 07:12:33 | /branches/8.6.0/conf/src/main/config/RTSConfig.xml
r4550 | n479826 | 2012-09-04 05:51:29 | /branches/8.6.0/conf/src/main/config/RTSConfig.xml
r4550 | n479826 | 2012-09-04 05:51:29 | /branches/8.6.0/conf/src/main/config/base.cfg
r4550 | n479826 | 2012-09-04 05:51:29 | /branches/8.6.0/conf/src/main/config/prod.cfg
r4550 | n479826 | 2012-09-04 05:51:29 | /branches/8.6.0/conf/src/main/config/qa.cfg
r4550 | n479826 | 2012-09-04 05:51:29 | /branches/8.6.0/conf/src/main/config/uat.cfg

入力ファイルはサンプルの svn-log ファイルです。変更されたすべての (M) ファイルをそれぞれの資格情報でフィルター処理したいと考えています。誰かがサンプルコードを手伝ってくれますか? 前もって感謝します。

4

1 に答える 1

3
awk -F"|" '/^r/{a=$1;b=$2;c=substr($3,0,20)}/^   M/{gsub(/   M /," ");print a"|"b"|"c"|"$0}' your_file

テスト済み:

> awk -F"|" '/^r/{a=$1;b=$2;c=substr($3,0,20)}/^   M/{gsub(/   M /," ");print a"|"b"|"c"|"$0}' temp
r4544 | n479826 | 2012-08-28 07:12:33| /branches/8.6.0/conf/src/main/config/RTSConfig.xml
r4550 | n479826 | 2012-09-04 05:51:29| /branches/8.6.0/conf/src/main/config/RTSConfig.xml
r4550 | n479826 | 2012-09-04 05:51:29| /branches/8.6.0/conf/src/main/config/base.cfg
r4550 | n479826 | 2012-09-04 05:51:29| /branches/8.6.0/conf/src/main/config/prod.cfg
r4550 | n479826 | 2012-09-04 05:51:29| /branches/8.6.0/conf/src/main/config/qa.cfg
r4550 | n479826 | 2012-09-04 05:51:29| /branches/8.6.0/conf/src/main/config/uat.cfg

説明:

/^r/{a=$1;b=$2;c=substr($3,0,20)}

上記のコード ブロックは、行が文字 r で始まる場合にのみ実行されます。ブロック内では、最初のフィールドを a に保存し、2 番目のフィールドを b に保存し、3 番目のフィールドを入力から次のように保存します。

2012-08-28 07:12:33 -0400 (Tue, 28 Aug 2012)

しかし、タイムスタンプ付きの日付だけが必要で、残りは時代遅れです。常に 20 文字です。そのため、3 番目のフィールドから部分文字列を取得し、c に格納しました。

私の主な関心は /^ M/ で始まる行でした。これは、r で始まる前の行に存在する情報とともに表示する必要があり、すべての情報を含む目的の行の前に r で始まる行があることを確認してください。 M で始まる行を先頭に追加する必要があります。

そのため、行が M で始まるたびに、ab と c に格納されている値が先頭に追加されます。

M/{gsub(/ M /," ");print a"|"b"|"c"|"$0}

gsub part は、現在の行からスペースを含む " M " の部分を削除します。印刷部分は、ab と c の値を現在の行に | で追加するだけです。セパレータとして。

于 2013-01-15T11:50:14.883 に答える