awk使用法之:行をマージ

1526 ワード

awk行のマージ方法
たとえば、「^AAAAAA」の先頭の行と、その後ろの行を1行にまとめ、他の行が正常に出力されます.
$ cat -n t.txt 
     1  prefixion 1
     2  AAAA aaaa
     3  appending 1
     4  BBBB bbbb
     5  prefixion 2
     6  AAAA aaaa
     7  appending 2
     8  CCCC cccc

スクリプト:
$ cat -n t.sh
     1  awk '
     2    BEGIN     { found=0; buffer="" }
     3    /^AAAA /  { found=1; buffer=$0; next }
     4              { if (found == 1) {
     5                   printf "%s %s
", buffer, $0 6 found=0 7 } else { 8 printf "%s
", $0 9 } 10 } 11 ' t.txt

実行結果:
prefixion 1
AAAA aaaa appending 1
BBBB bbbb
prefixion 2
AAAA aaaa appending 2
CCCC cccc

主な手順:
  • は「AAAA」の先頭の行に出会い、foundタグを付け、行の内容をbufferに保存します.
  • 他のローに遭遇しました:
  • 現在foundがtrueとマークされている場合、bufferのコンテンツと現在の行のコンテンツが印刷され、この動作は行をマージする機能として機能する.
  • 現在のfoundがfalseとマークされている場合は、他の行であり、通常印刷されます.

  • BEGINは、データファイルが何行あるかにかかわらず、スクリプトの開始時に一度だけ処理されます.
  • スクリプトの3行目にはnext命令があり、スクリプトの現在の行に対する処理を直接終了し、次の行のデータ入力を処理することを意味する.逆にnext命令がなければ、後の文は実行され続け、私たちの例では、「AAAA」の先頭の行は2回印刷され、後のマージは無効になります.運転の結果を見る:
  • prefixion 1
    AAAA aaaa AAAA aaaa
    appending 1
    BBBB bbbb
    prefixion 2
    AAAA aaaa AAAA aaaa
    appending 2
    CCCC cccc
    

    5行目printf "%s %s
    ", buffer, $0
    のため、bufferの内容と$0の内容は同じであり、すなわち「AAAA」の先頭の行である.