1

私はこのようなテキストファイルを持っています:

********** time1 **********
line of text1
line of text1.1
line of text1.2
********** time2 **********
********** time3 **********
********** time4 **********
line of text2.1
line of text2.2
********** time5 **********
********** time6 **********
line of text3.1

テキスト行とその上の時間(星なし)を抽出てファイルに保存したい(その下にテキスト行がない時間は無視する必要があります)。できればgrepとawkでこれを行いたいです。たとえば、上記のコードの出力は次のようになります。

time1 : line of text1
time1 : line of text1.1
time1 : line of text1.2
time4 : line of text2.1
time4 : line of text2.2
time6 : line of text3

どうすればいいですか?

4

7 に答える 7

2

これは、時間にスペースがなく、各時間マーカーの後に 1 行 (または 0 行) のテキストしかないことを前提としています。

awk '$1 ~ /\*+/ {prev = $2} $1 !~ /\*+/ {print prev, ":", $0}' inputfile
于 2012-05-29T13:40:11.573 に答える
2

時間内のスペースで動作します:

awk '/^[^*]+/ { gsub(/*/,"",x);printf x": "; print };{x=$0}' data.txt
于 2012-05-29T14:13:30.753 に答える
1

あなたは次のようにそれを行うことができますvim

:%s_\*\+ \(YOUR TIME PATTERN\) \*\+\_.\(\[^*\].*\)$_\1 : \2_ | g_\*\+ YOUR TIME PATTERN \*\+_d

それは行を検索しTIME PATTERN、時間パターンと次の行が で始まらない場合は保存し*ます。次に、それらから新しい行を作成します。次に、残りのTIME PATTERN行をすべて削除します。

これは、時間パターン行が などで終わっていることを前提としていることに注意*してください。

awk:

awk '/\*+ YOUR TIME PATTERN \*+/ { time=gensub("\*+ (YOUR TIME PATTERN) \*+","\\1","g") }
     ! /\*+ YOUR TIME PATTERN \*+/ { print time " : " $0 }' INPUTFILE

そして、それを行う他の方法があります。

于 2012-05-29T13:33:20.210 に答える
1

awk では、以下を参照してください。

#!/bin/bash

awk '
    BEGIN{
        t=0
    }
    {
        if ($0 ~ " time[0-9]+ ") {
            v=$2
            t=1
        }
        else if ($0 ~ "line of text") {
            if (t==1) {
                printf("%s : %s\n", v, $0)
            } else {
               t=0;
            }
        }
    }
' FILE

FILEファイル名に置き換えるだけです。

于 2012-05-29T14:02:53.457 に答える
0
awk '{ if( $0 ~ /^\*+ time[0-9] \*+$/ ) { time = $2 } else { print time " : " $0 } }' file
于 2012-05-29T14:08:55.490 に答える
0
$ uniq -f 2 input-file | awk '{getline n; print $2 " : " n}'

タイムスタンプにスペースが含まれている場合は、引数を-fオプションに変更してuniq、の最終文字列のみを比較します*。たとえば、-f XX-2 がタイムスタンプ内のスペースの数である場合に使用します。また、タイムスタンプにスペースがある場合は、awk を変更する必要があります。これらのいずれかが機能します。

$ uniq -f 3 input-file | awk -F '**********' '{getline n; print $2 " : " n}'
$ uniq -f 3 input-file | awk '{getline n; $1=""; $NF=""; print $0 ": " n }'
于 2012-05-29T17:02:23.277 に答える
0

これはうまくいくかもしれません(GNU sed):

sed '/^\*\+ \S\+.*/!d;s/[ *]//g;$!N;/\n[^*]/!D;s/\n/ : /' file

説明:

  • *削除しない場合は、'sで始まる行を探します。/^\*\+ \S\+.*/!d
  • タイムラインを取得しました。*とスペースを削除します (時間を残します)。s/[ *]//g
  • 次の行を取得$!N
  • *2 行目が's で始まっていないことを確認します。それ以外の場合は、最初の行を削除します/\n[^*]/!D
  • 意図したパターンを取得\nし、間隔を空け:て印刷します。s/\n/ : /
于 2012-05-29T13:42:28.607 に答える