0

awkでファイルトラバーサルを行っています。これの例は

Dat time range column session - 1
time name place session animal - 2 
hi bye name things - 3

これらの両方で。行ごとにトラバースする必要があり、 を含む行で単語ごとにトラバースする必要がありますsession

したがって、この場合、セッションという単語が含まれているため、1行目と2行目に到達する必要がありますが、3行目はそのフィールドが含まれていないためです(ある意味では、これをスキップできます)。そこから単語ごとにトラバースして、 session フィールドに到達する必要があります。

私は$0ライン全体を表すことができることを知っています。しかし、私の質問は、行に到達した後、単語ごとにトラバースする方法です。

これについて私を助けてください。ありがとうございました。

4

2 に答える 2

1

$0この構成を使用して、現在の行をループできます。

for(i = 1; i <= NF; i++) print $i

NFこれは、現在の行のフィールド数を表す事前定義されたawk変数を利用します( $0)。

の値を調べ$iて、行を繰り返し、それに基づいて値をどう処理するかを決定できます。たとえば、印刷したり、スキップしたりします。if ($i == "session") ...

アップデート:

このmatch()関数を使用して、処理している現在の行に「セッション」文字列が含まれているかどうかを、行を反復処理せずに判別することもできます。例えば、

where = match($0, "session")
if (where > 0)
   print "Found session in this line";
else
   print "session not found in this line";

match()2番目のパラメーターとして正規表現を使用するため、一致を非常に高度にすることができます。この関数およびその他のawk文字列関数の詳細については、このページを参照してください。

于 2012-07-10T16:49:07.187 に答える
1

for「セッション」を含む行のみをフィルタリングして、ループを使用できます。

awk '/session/{ for (i = 1; i <= NF; i++) { \
                  if ($i == "session") \
                    do_whatever_here \
                } \
              }'

これらの手順について詳しくはfor、 、文字列比較、およびif.

于 2012-07-10T16:52:11.820 に答える